/ Hex Artifact Content
Login

Artifact 1915e3ec1a2157d0c29086b7fc0c936a2d97029e:


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 54 4f 44 4f 3a 20 52 65 61 6c 6c 79 2c 20 74   TODO: Really, t
afe0: 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  his doesn't need
aff0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20   to be cleared. 
b000: 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20     ** until the 
b010: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
b020: 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61  heck fails in Pa
b030: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e  gerSharedLock().
b040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
b050: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
b060: 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = 0;..    rc = o
b070: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b080: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
b090: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
b0a0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b0b0: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
b0c0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
b0d0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
b0e0: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
b0f0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
b100: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
b110: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
b120: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
b130: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
b140: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
b150: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
b160: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
b170: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
b180: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
b190: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
b1a0: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
b1b0: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
b1c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
b1d0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
b1e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b1f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
b200: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
b210: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
b220: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
b230: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
b240: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
b250: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
b260: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
b270: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
b280: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65  NLOCK;.    pPage
b290: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
b2a0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
b2b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
b2c0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
b2d0: 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f  hen an IOERR, CO
b2e0: 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72  RRUPT or FULL er
b2f0: 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20  ror.** may have 
b300: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69  occurred. The fi
b310: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
b320: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b330: 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
b340: 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
b350: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
b360: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
b370: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
b380: 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
b390: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
b3a0: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
b3b0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
b3c0: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
b3d0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
b3e0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
b3f0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
b400: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
b410: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
b420: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
b430: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
b440: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
b450: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
b460: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
b470: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
b480: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
b490: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
b4a0: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
b4b0: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
b4c0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
b4d0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
b4e0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
b4f0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
b500: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
b510: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
b520: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
b530: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
b540: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
b550: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
b560: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b570: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
b580: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
b590: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
b5a0: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
b5b0: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
b5c0: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
b5d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
b5e0: 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
b5f0: 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
b600: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
b610: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
b620: 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
b630: 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
b640: 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
b650: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
b660: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b670: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
b680: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
b690: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
b6a0: 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
b6b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
b6c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b6d0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
b6e0: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
b6f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
b700: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
b710: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
b720: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
b730: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
b740: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
b750: 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
b760: 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
b770: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b780: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
b790: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b7a0: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
b7b0: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
b7c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
b7d0: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
b7e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
b7f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b800: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
b810: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
b820: 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
b830: 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
b840: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
b850: 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
b860: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
b870: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
b880: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
b890: 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
b8a0: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
b8b0: 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
b8c0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
b8d0: 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20   file and clear 
b8e0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
b8f0: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
b900: 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  hat.** there is 
b910: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
b920: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
b930: 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
b940: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f  connection.** to
b950: 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
b960: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
b970: 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
b980: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a   this one) will.
b990: 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ** roll it back.
b9a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b9b0: 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
b9c0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
b9d0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74  error state, but
b9e0: 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
b9f0: 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
ba00: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
ba10: 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
ba20: 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
ba30: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
ba40: 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
ba50: 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
ba60: 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
ba70: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
ba80: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
ba90: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
baa0: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
bab0: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
bac0: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
bad0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
bae0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
baf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
bb00: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
bb10: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
bb20: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
bb30: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
bb40: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
bb50: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
bb60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
bb70: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
bb80: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
bb90: 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
bba0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bbb0: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
bbc0: 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
bbd0: 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
bbe0: 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
bbf0: 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
bc00: 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
bc10: 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
bc20: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
bc30: 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
bc40: 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
bc50: 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
bc60: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
bc70: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
bc80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
bc90: 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
bca0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
bcb0: 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
bcc0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
bcd0: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  n..** .** If the
bce0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
bcf0: 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47  ER_SHARED or PAG
bd00: 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
bd10: 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  when this.** rou
bd20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
bd30: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72  it is a no-op (r
bd40: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
bd50: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
bd60: 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
bd70: 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
bd80: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
bd90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bda0: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
bdb0: 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
bdc0: 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
bdd0: 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
bde0: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
bdf0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
be00: 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
be10: 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
be20: 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
be30: 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
be40: 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
be50: 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
be60: 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
be70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
be80: 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
be90: 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
bea0: 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
beb0: 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
bec0: 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
bed0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
bee0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
bef0: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
bf00: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
bf10: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
bf20: 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
bf30: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
bf40: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
bf50: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
bf60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
bf70: 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
bf80: 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
bf90: 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
bfa0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
bfb0: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
bfc0: 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
bfd0: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
bfe0: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
bff0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
c000: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
c010: 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
c020: 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
c030: 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
c040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
c050: 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
c060: 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
c070: 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
c080: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
c090: 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
c0a0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
c0b0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
c0c0: 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
c0d0: 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
c0e0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
c0f0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
c100: 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
c110: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
c120: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
c130: 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
c140: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
c150: 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
c160: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c170: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c180: 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
c190: 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
c1a0: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
c1b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
c1c0: 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
c1d0: 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
c1e0: 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
c1f0: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
c200: 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
c210: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
c220: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
c230: 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
c240: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
c250: 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
c260: 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
c270: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
c280: 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e  nalized, if runn
c290: 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
c2a0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sive mode, the.*
c2b0: 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  * pager moves to
c2c0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
c2d0: 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61  ate (and downgra
c2e0: 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  des the lock on 
c2f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
c300: 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  file accordingly
c310: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
c320: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
c330: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c340: 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47  de and is in PAG
c350: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c  ER_SYNCED state,
c360: 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20  .** it moves to 
c370: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
c380: 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f   No locks are do
c390: 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75  wngraded when ru
c3a0: 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c  nning in.** excl
c3b0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
c3c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
c3d0: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
c3e0: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
c3f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
c400: 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
c410: 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
c420: 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
c430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
c440: 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
c450: 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
c460: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
c470: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
c480: 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
c490: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
c4a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
c4b0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
c4c0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
c4d0: 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
c4e0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
c4f0: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
c500: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
c510: 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
c520: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
c530: 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
c540: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
c550: 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
c560: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
c570: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
c580: 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
c590: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
c5a0: 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
c5b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c5c0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
c5d0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
c5e0: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
c5f0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
c600: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
c610: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
c620: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
c630: 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
c640: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
c650: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
c660: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
c670: 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
c680: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
c690: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c6a0: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
c6b0: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
c6c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
c6d0: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
c6e0: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
c6f0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
c700: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
c710: 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
c720: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
c730: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c740: 6a 66 64 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  jfd) ){..    /* 
c750: 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
c760: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
c770: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d    if( sqlite3IsM
c780: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
c790: 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
c7a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c7b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
c7c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
c7d0: 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73  EMORY );.      s
c7e0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c7f0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
c800: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
c810: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
c820: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c830: 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
c840: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
c850: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
c860: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c870: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
c880: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
c890: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
c8a0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
c8b0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c8c0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c8d0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
c8e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c8f0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
c900: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
c910: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
c920: 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
c930: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
c940: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c950: 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a  _PERSIST.    ){.
c960: 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a        rc = zeroJ
c970: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
c980: 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20  , hasMaster);.  
c990: 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
c9a0: 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
c9b0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c9c0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
c9d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c9e0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
c9f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
ca00: 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
ca10: 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
ca20: 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
ca30: 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
ca40: 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
ca50: 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
ca60: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
ca70: 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
ca80: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
ca90: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
caa0: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
cab0: 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
cac0: 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
cad0: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
cae0: 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
caf0: 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
cb00: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
cb10: 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  al.  */.      as
cb20: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
cb30: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
cb40: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
cb50: 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
cb60: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
cb70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
cb80: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
cb90: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
cba0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
cbb0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
cbc0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
cbd0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
cbe0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cbf0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
cc00: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
cc10: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
cc20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
cc30: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
cc40: 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
cc50: 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
cc60: 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
cc70: 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
cc80: 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69  pagehash);.#endi
cc90: 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  f..    sqlite3Pc
cca0: 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
ccb0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
ccc0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
ccd0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
cce0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
ccf0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
cd00: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  nal = 0;.    pPa
cd10: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
cd20: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
cd30: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
cd40: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
cd50: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
cd60: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
cd70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
cd80: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
cd90: 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  D;.    pPager->c
cda0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
cdb0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
cdc0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
cdd0: 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20  AGER_SYNCED ){. 
cde0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cdf0: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
ce00: 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  VE;.  }.  pPager
ce10: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
ce20: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
ce30: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
ce40: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
ce50: 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  0;..  /* TODO: I
ce60: 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20  s this optimal? 
ce70: 57 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69  Why is the db si
ce80: 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68  ze invalidated h
ce90: 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74  ere .  ** when t
cea0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ceb0: 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64   is not unlocked
cec0: 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ? */.  pPager->d
ced0: 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20  bOrigSize = 0;. 
cee0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
cef0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
cf00: 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
cf10: 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  dbSize);.  if( !
cf20: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
cf30: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
cf40: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
cf50: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
cf60: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
cf70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
cf80: 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
cf90: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
cfa0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
cfb0: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
cfc0: 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
cfd0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
cfe0: 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
cff0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
d000: 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
d010: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
d020: 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
d030: 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
d040: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
d050: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
d060: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
d070: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
d080: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
d090: 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
d0a0: 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
d0b0: 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
d0c0: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
d0d0: 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
d0e0: 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
d0f0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
d100: 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
d110: 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
d120: 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
d130: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
d140: 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
d150: 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
d160: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
d170: 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
d180: 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
d190: 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
d1a0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
d1b0: 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
d1c0: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
d1d0: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
d1e0: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
d1f0: 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
d200: 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
d210: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
d220: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
d230: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
d240: 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
d250: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
d260: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
d270: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
d280: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
d290: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
d2a0: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
d2b0: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
d2c0: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
d2d0: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
d2e0: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
d2f0: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
d300: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
d310: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
d320: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
d330: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
d340: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
d350: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
d360: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
d370: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
d380: 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
d390: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
d3a0: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
d3b0: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
d3c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d3d0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
d3e0: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
d3f0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
d400: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
d410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
d420: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
d430: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
d440: 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
d450: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
d460: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
d470: 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
d480: 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
d490: 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
d4a0: 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
d4b0: 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
d4c0: 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
d4d0: 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
d4e0: 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
d4f0: 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
d500: 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
d510: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d520: 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
d530: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d540: 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   The isMainJrnl 
d550: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
d560: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  this is the main
d570: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d580: 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66  l and.** false f
d590: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
d5a0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
d5b0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
d5c0: 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65  rnal uses.** che
d5d0: 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
d5e0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
d5f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  oes not..**.** I
d600: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
d610: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
d620: 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
d630: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d640: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
d650: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
d660: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
d670: 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
d680: 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
d690: 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
d6a0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
d6b0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
d6c0: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
d6d0: 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
d6e0: 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
d6f0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
d700: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
d710: 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
d720: 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
d730: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
d740: 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
d750: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
d760: 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
d770: 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
d780: 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
d790: 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
d7a0: 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
d7b0: 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
d7c0: 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
d7d0: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
d7e0: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
d7f0: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
d800: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
d810: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
d820: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
d830: 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
d840: 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
d850: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d860: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
d870: 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
d880: 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
d890: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
d8a0: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
d8b0: 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
d8c0: 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
d8d0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
d8e0: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
d8f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
d900: 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
d910: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
d920: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d930: 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
d940: 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
d950: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
d960: 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
d970: 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
d980: 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
d990: 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
d9a0: 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
d9b0: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
d9c0: 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
d9d0: 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
d9e0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
d9f0: 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
da00: 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
da10: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
da20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
da30: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
da40: 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
da50: 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
da60: 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
da70: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
da80: 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
da90: 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
daa0: 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
dab0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
dac0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
dad0: 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
dae0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
daf0: 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
db00: 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
db10: 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
db20: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
db30: 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
db40: 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
db50: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
db60: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
db70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
db80: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
db90: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
dba0: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
dbb0: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
dbc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
dbd0: 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
dbe0: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  ack */.  int isM
dbf0: 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20  ainJrnl,        
dc00: 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d         /* 1 -> m
dc10: 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d  ain journal. 0 -
dc20: 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  > sub-journal. *
dc30: 2f 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63  /.  int isUnsync
dc40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dc50: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
dc60: 64 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63  ding from unsync
dc70: 65 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ed main journal 
dc80: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
dc90: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
dca0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
dcb0: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
dcc0: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  ck */.  int isSa
dcd0: 76 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20  vepnt,          
dce0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
dcf0: 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
dd00: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  llback */.  Bitv
dd10: 65 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20  ec *pDone       
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
dd30: 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
dd40: 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
dd50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
dd60: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
dd90: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
dda0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
ddb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ddc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
ddd0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
dde0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
ddf0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
de20: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
de30: 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
de40: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
de50: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
de60: 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
de70: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
de80: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
de90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
dea0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
deb0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
dec0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  nal file */..  a
ded0: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
dee0: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
def0: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
df00: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
df10: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
df20: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
df30: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
df40: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
df50: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
df60: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
df70: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
df80: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
df90: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
dfa0: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
dfb0: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
dfc0: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
dfd0: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
dfe0: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
dff0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
e000: 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
e010: 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
e020: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
e030: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
e040: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
e050: 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
e060: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
e070: 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
e080: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
e090: 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
e0a0: 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
e0b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
e0c0: 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
e0d0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
e0e0: 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
e0f0: 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
e100: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
e110: 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
e120: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
e130: 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
e140: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e150: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
e160: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
e170: 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
e180: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e190: 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
e1a0: 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
e1b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
e1c0: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
e1d0: 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
e1e0: 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
e1f0: 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
e200: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
e210: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
e220: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
e230: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
e240: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
e250: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
e260: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
e270: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
e280: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
e290: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
e2a0: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
e2b0: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
e2c0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
e2d0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
e2e0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
e2f0: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
e300: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
e310: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
e320: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
e330: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
e340: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
e350: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
e360: 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
e370: 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
e380: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
e390: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
e3a0: 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
e3b0: 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
e3c0: 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
e3d0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
e3e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e3f0: 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
e400: 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
e410: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
e420: 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
e430: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
e440: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e450: 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
e460: 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
e470: 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
e480: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
e490: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e4a0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
e4b0: 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  }..  if( pDone &
e4c0: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
e4d0: 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
e4e0: 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
e4f0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
e500: 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
e510: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
e520: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
e530: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
e540: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
e550: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
e560: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
e570: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
e580: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
e590: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
e5a0: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
e5b0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
e5c0: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
e5d0: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
e5e0: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
e5f0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
e600: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
e610: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
e620: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
e630: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
e640: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
e650: 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
e660: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
e670: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
e680: 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
e690: 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
e6a0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
e6b0: 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
e6c0: 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
e6d0: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
e6e0: 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
e6f0: 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
e700: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
e710: 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
e720: 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
e730: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
e740: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
e750: 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
e760: 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
e770: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
e780: 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
e790: 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
e7a0: 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
e7b0: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
e7c0: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
e7d0: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
e7e0: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
e7f0: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
e800: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
e810: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
e820: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
e830: 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  ty..  **.  ** Ti
e840: 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
e850: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e860: 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
e870: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
e880: 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
e890: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
e8a0: 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
e8b0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
e8c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
e8d0: 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
e8e0: 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
e8f0: 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
e900: 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
e910: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
e920: 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
e930: 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
e940: 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
e950: 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
e960: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
e970: 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
e980: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
e990: 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
e9a0: 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
e9b0: 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
e9c0: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
e9d0: 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
e9e0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
e9f0: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
ea00: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
ea10: 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
ea20: 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
ea30: 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
ea40: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
ea50: 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
ea60: 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
ea70: 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
ea80: 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
ea90: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
eaa0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
eab0: 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
eac0: 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
ead0: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
eae0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
eaf0: 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
eb00: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
eb10: 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
eb20: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
eb30: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
eb40: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
eb50: 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
eb60: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
eb70: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
eb80: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
eb90: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
eba0: 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
ebb0: 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
ebc0: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
ebd0: 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
ebe0: 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
ebf0: 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
ec00: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
ec10: 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
ec20: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
ec30: 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
ec40: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
ec50: 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
ec60: 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
ec70: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
ec80: 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
ec90: 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
eca0: 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
ecb0: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
ecc0: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
ecd0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
ece0: 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
ecf0: 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
ed00: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
ed10: 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
ed20: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50  n",.           P
ed30: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
ed40: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
ed50: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
ed60: 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74  eSize, (u8*)aDat
ed70: 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  a),.           (
ed80: 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
ed90: 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
eda0: 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
edb0: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
edc0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
edd0: 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67  SIVE).   && (pPg
ede0: 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
edf0: 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
ee00: 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73  _SYNC)).   && is
ee10: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
ee20: 0a 20 20 20 26 26 20 21 69 73 55 6e 73 79 6e 63  .   && !isUnsync
ee30: 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
ee40: 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
ee50: 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
ee60: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
ee70: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
ee80: 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44  ger->fd, (u8*)aD
ee90: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
eea0: 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
eeb0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
eec0: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
eed0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
eee0: 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
eef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ef00: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
ef10: 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
ef20: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
ef30: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
ef40: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
ef50: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
ef60: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
ef70: 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
ef80: 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
ef90: 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
efa0: 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
efb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
efc0: 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
efd0: 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
efe0: 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
eff0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f000: 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
f010: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
f020: 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
f030: 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
f040: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
f050: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
f060: 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
f070: 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
f080: 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
f090: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
f0a0: 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
f0b0: 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
f0c0: 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
f0d0: 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
f0e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f0f0: 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
f100: 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
f110: 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
f120: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
f130: 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
f140: 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
f150: 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
f160: 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
f170: 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
f180: 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
f190: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
f1a0: 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
f1b0: 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
f1c0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
f1d0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
f1e0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
f1f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
f200: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
f210: 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
f220: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
f230: 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
f240: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
f250: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
f260: 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
f270: 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
f280: 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
f290: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
f2a0: 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
f2b0: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
f2c0: 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
f2d0: 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
f2e0: 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
f2f0: 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
f300: 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
f310: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
f320: 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
f330: 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
f340: 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
f350: 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
f360: 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
f370: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  t );.    if( (rc
f380: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
f390: 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
f3a0: 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29 21 3d  gno, &pPg, 1))!=
f3b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f3c0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f3d0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61    }.    pPg->fla
f3e0: 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
f3f0: 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69  D_READ;.    sqli
f400: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
f410: 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
f420: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
f430: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
f440: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
f450: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
f460: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
f470: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
f480: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
f490: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
f4a0: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
f4b0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
f4c0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
f4d0: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
f4e0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
f4f0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
f500: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
f510: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
f520: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
f530: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
f540: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
f550: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
f560: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
f570: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
f580: 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
f590: 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
f5a0: 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
f5b0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
f5c0: 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
f5d0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
f5e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69  );.    if( isMai
f5f0: 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76  nJrnl && (!isSav
f600: 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74  epnt || *pOffset
f610: 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
f620: 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  lHdr) ){.      /
f630: 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  * If the content
f640: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77  s of this page w
f650: 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65  ere just restore
f660: 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  d from the main 
f670: 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
f680: 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73  l file, then its
f690: 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65   content must be
f6a0: 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68   as they were wh
f6b0: 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
f6c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
f6d0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49   first opened. I
f6e0: 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63  n this case we c
f6f0: 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  an mark the page
f700: 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65  .      ** as cle
f710: 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  an, since there 
f720: 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20  will be no need 
f730: 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  to write it out 
f740: 74 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a  to the..      **
f750: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
f760: 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
f770: 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
f780: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
f790: 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
f7a0: 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
f7b0: 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
f7c0: 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
f7d0: 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
f7e0: 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
f7f0: 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
f800: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
f810: 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
f820: 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
f830: 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
f840: 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
f850: 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
f860: 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
f870: 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
f880: 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
f890: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
f8a0: 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
f8b0: 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
f8c0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
f8d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
f8e0: 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
f8f0: 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
f900: 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
f910: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f920: 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
f930: 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
f940: 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
f950: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
f960: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
f970: 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
f980: 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
f990: 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
f9a0: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
f9b0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
f9c0: 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
f9d0: 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
f9e0: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
f9f0: 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
fa00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
fa10: 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
fa20: 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
fa30: 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
fa40: 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
fa50: 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
fa60: 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
fa70: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
fa80: 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
fa90: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
faa0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
fab0: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
fac0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
fad0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
fae0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
faf0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
fb00: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
fb10: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
fb20: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
fb30: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
fb40: 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
fb50: 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
fb60: 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
fb70: 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
fb80: 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
fb90: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
fba0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
fbb0: 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
fbc0: 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
fbd0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
fbe0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
fbf0: 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
fc00: 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
fc10: 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
fc20: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
fc30: 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
fc40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
fc50: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
fc60: 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
fc70: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fc80: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
fc90: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
fca0: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
fcb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
fcc0: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
fcd0: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
fce0: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
fcf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fd00: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
fd10: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
fd20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
fd30: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
fd40: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
fd50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fd60: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
fd70: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
fd80: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
fd90: 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
fda0: 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
fdb0: 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
fdc0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
fdd0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
fde0: 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
fdf0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
fe00: 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
fe10: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
fe20: 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
fe30: 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
fe40: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
fe50: 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
fe60: 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
fe70: 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
fe80: 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
fe90: 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
fea0: 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
feb0: 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
fec0: 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
fed0: 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
fee0: 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
fef0: 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
ff00: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
ff10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
ff20: 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
ff30: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
ff40: 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
ff50: 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
ff60: 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
ff70: 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
ff80: 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
ff90: 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
ffa0: 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
ffb0: 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
ffc0: 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
ffd0: 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
ffe0: 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
fff0: 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
10000 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
10010 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
10020 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10030 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10040 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
10050 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
10060 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
10070 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
10080 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
10090 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
100a0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
100b0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
100c0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
100d0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
100e0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
100f0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10100 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
10110 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
10120 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
10130 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
10140 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10150 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10160 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10170 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10180 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
10190 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
101a0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
101b0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
101c0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
101d0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
101e0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
101f0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
10200 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
10210 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
10220 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
10230 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
10240 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10250 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10260 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10270 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10280 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10290 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
102a0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
102b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
102c0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
102d0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
102e0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
102f0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
10300 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
10310 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
10320 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
10330 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
10340 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10350 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10360 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10370 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10380 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10390 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
103a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
103b0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
103c0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
103d0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
103e0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
103f0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
10400 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
10410 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10420 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
10430 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10440 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10450 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10460 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10470 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
104a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
104b0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
104c0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
104d0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
104e0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
104f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10500 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10510 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10520 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10530 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10540 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10550 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10560 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10570 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10580 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10590 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
105a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
105b0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
105c0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
105d0 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
105e0 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
105f0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10600 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10610 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10620 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10630 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10640 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10650 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10660 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10670 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10680 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10690 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
106a0 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
106b0 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
106c0 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
106d0 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
106e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
106f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
10700 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
10710 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10720 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
10730 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
10740 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10750 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
10760 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
10770 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
10780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10790 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
107a0 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
107b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
107c0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
107d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
107e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
107f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10800 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
10810 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
10820 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
10830 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
10840 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
10850 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
10860 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
10870 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
10880 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
10890 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
108a0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
108b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
108c0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
108d0 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
108e0 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
108f0 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
10900 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
10910 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
10920 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72  loc((int)nMaster
10930 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
10940 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 20 20 69  rPtr + 1);.    i
10950 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
10960 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
10970 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10980 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10990 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
109a0 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20     zMasterPtr = 
109b0 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
109c0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
109d0 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
109e0 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
109f0 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
10a00 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
10a10 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
10a20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10a30 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10a40 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73  er_out;.    zMas
10a50 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
10a60 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
10a70 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
10a80 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
10a90 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
10aa0 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
10ab0 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
10ac0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nal ){.      int
10ad0 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72   exists;.      r
10ae0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
10af0 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
10b00 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
10b10 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
10b20 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
10b30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10b40 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
10b50 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
10b60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78 69   }.      if( exi
10b70 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  sts ){.        /
10b80 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
10b90 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
10ba0 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
10bb0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
10bc0 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
10bd0 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
10be0 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
10bf0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
10c00 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
10c10 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
10c20 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
10c30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10c40 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
10c50 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
10c60 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
10c70 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
10c80 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
10c90 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
10ca0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
10cb0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
10cc0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
10cd0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
10ce0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
10cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10d00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
10d10 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
10d20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
10d30 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
10d40 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
10d50 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
10d60 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
10d70 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
10d80 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
10d90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10da0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10db0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
10dc0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
10dd0 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
10de0 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
10df0 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
10e00 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
10e10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
10e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
10e30 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
10e40 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
10e50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10e60 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
10e70 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10e80 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
10e90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10ea0 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
10eb0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
10ec0 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
10ed0 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
10ee0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10ef0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
10f00 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
10f10 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
10f20 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
10f30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
10f40 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
10f50 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72    .  if( pMaster
10f60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
10f70 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
10f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
10f90 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
10fa0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10fb0 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
10fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10fd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10fe0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
10ff0 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
11000 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
11010 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
11020 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
11030 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
11040 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
11050 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
11060 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
11070 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
11080 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
11090 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
110a0 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
110b0 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
110c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
110d0 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20  not open, or an 
110e0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
110f0 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74  s not.** held, t
11100 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11110 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
11120 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  se, the size of 
11130 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  the file is.** c
11140 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
11150 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
11160 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
11170 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c  tes). If the fil
11180 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20  e.** on disk is 
11190 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
111a0 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
111b0 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
111c0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
111d0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
111e0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
111f0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
11200 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
11210 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
11220 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
11230 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
11240 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
11250 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
11260 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
11270 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
11280 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
11290 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
112a0 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
112b0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
112c0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
112d0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
112e0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
112f0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
11300 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
11310 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
11320 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
11330 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
11340 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
11350 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
11360 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
11370 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
11380 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
11390 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
113a0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
113b0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
113c0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
113d0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
113e0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
113f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11400 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
11410 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
11420 45 58 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f  EXCLUSIVE && isO
11430 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
11440 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
11450 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
11460 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
11470 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
11480 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
11490 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
114a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
114b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
114c0 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
114d0 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
114e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
114f0 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
11500 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11510 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
11520 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
11530 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
11540 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
11550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11560 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11570 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
11580 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11590 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
115a0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
115b0 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
115c0 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
115d0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
115e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
11600 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
11610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11620 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11630 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11640 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
11650 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
11660 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
11670 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
11680 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
11690 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
116a0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
116b0 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
116c0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
116d0 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
116e0 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
116f0 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
11700 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
11710 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
11720 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
11730 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
11740 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
11750 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
11760 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
11770 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
11780 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
11790 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
117a0 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
117b0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
117c0 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
117d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
117e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
117f0 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
11800 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
11810 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
11820 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
11830 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
11840 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
11850 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
11860 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
11870 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
11880 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
11890 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
118a0 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
118b0 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
118c0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
118d0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
118e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
118f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
11900 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
11910 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11920 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
11930 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
11940 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
11950 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
11960 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11970 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
11980 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
11990 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
119a0 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
119b0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
119c0 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
119d0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
119e0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
119f0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
11a00 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
11a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
11a20 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
11a30 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
11a40 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
11a50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11a60 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
11a70 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
11a80 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
11a90 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
11aa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
11ab0 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
11ac0 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
11ad0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
11ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
11af0 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
11b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11b10 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
11b20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
11b30 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
11b40 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
11b50 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
11b60 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
11b70 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
11b80 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
11b90 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
11ba0 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
11bb0 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
11bc0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
11bd0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
11be0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
11bf0 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
11c00 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
11c10 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
11c20 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
11c30 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
11c40 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
11c50 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
11c60 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
11c70 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
11c80 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
11c90 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
11ca0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
11cb0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
11cc0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
11cd0 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
11ce0 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
11cf0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
11d00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
11d10 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
11d20 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
11d30 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
11d40 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
11d50 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
11d60 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
11d70 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
11d80 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
11d90 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
11da0 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
11db0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
11dc0 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
11dd0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
11de0 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
11df0 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
11e00 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
11e10 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
11e20 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
11e30 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
11e40 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
11e50 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
11e60 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
11e70 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
11e80 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
11e90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11ea0 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
11eb0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
11ec0 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
11ed0 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
11ee0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
11ef0 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
11f00 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
11f10 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
11f20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
11f30 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
11f40 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
11f50 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
11f60 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
11f70 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
11f80 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
11f90 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
11fa0 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
11fb0 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
11fc0 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
11fd0 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
11fe0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
11ff0 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
12000 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
12020 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
12030 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
12040 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
12050 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
12060 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
12070 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
12080 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
12090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
120a0 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
120b0 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
120c0 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
120d0 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
120e0 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
120f0 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
12100 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
12110 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
12120 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
12130 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
12140 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
12150 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
12160 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
12170 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
12180 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
12190 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
121a0 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
121b0 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
121c0 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
121d0 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
121e0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
121f0 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
12200 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
12210 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
12220 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
12230 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
12240 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
12250 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
12260 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
12270 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
12280 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
12290 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
122a0 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
122b0 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
122c0 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
122d0 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
122e0 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
122f0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
12300 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
12310 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
12320 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
12330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
12340 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
12350 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
12360 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
12370 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
12380 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
12390 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
123a0 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
123b0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
123c0 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
123d0 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
123e0 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
123f0 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
12400 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
12410 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
12420 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
12430 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
12440 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
12450 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
12460 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
12470 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
12480 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
12490 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
124a0 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
124b0 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
124c0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
124d0 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
124e0 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
124f0 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
12500 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
12510 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
12520 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
12530 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
12540 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
12550 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
12560 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
12570 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
12580 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
12590 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
125a0 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
125b0 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
125c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
125d0 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
125e0 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
125f0 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
12600 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
12610 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
12620 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
12630 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
12640 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
12650 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
12680 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
12690 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
126a0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
126b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
126c0 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
126d0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
126e0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
126f0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
12700 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
12710 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
12720 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
12730 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
12740 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
12750 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
12780 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
12790 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127b0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
127c0 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
127d0 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
127e0 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
127f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
12800 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12810 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
12820 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
12830 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
12840 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
12850 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
12860 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
12870 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
12880 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
12890 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
128a0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
128b0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
128c0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
128d0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
128e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
128f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12900 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
12910 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
12920 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12930 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
12940 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
12950 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
12960 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
12970 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
12980 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
12990 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
129a0 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
129b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
129c0 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
129d0 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
129e0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
129f0 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
12a00 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
12a10 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
12a20 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
12a30 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
12a40 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
12a50 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
12a60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
12a70 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
12a80 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
12a90 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
12aa0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
12ab0 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
12ac0 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
12ad0 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
12ae0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
12af0 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
12b00 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
12b10 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
12b20 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
12b30 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
12b40 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
12b50 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
12b60 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
12b70 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
12b80 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
12b90 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
12ba0 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
12bb0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
12bc0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
12bd0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
12be0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
12bf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12c00 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
12c10 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
12c20 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
12c30 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
12c40 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
12c50 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
12c60 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
12c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12c80 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
12c90 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
12ca0 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
12cb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12cc0 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
12cd0 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
12ce0 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
12cf0 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
12d00 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
12d10 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
12d20 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
12d30 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
12d40 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
12d50 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
12d60 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
12d70 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
12d80 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73 79  {.    int isUnsy
12d90 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
12da0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
12db0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
12dc0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
12dd0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
12de0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
12df0 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
12e00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
12e10 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
12e20 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
12e30 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
12e40 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
12e50 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
12e60 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
12e70 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
12e80 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
12e90 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
12ea0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
12eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
12ec0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
12ed0 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
12ee0 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
12ef0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
12f10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12f20 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
12f30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12f50 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
12f60 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
12f70 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
12f80 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
12f90 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
12fa0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
12fb0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
12fc0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
12fd0 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
12fe0 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
12ff0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
13000 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
13010 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
13020 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
13030 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
13040 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
13050 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
13060 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
13070 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
13080 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
13090 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
130a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
130b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
130c0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
130d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
130e0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
130f0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
13100 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
13110 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
13120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
13130 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
13140 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
13150 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
13160 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
13170 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
13180 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
13190 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
131a0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
131b0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
131c0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
131d0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
131e0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
131f0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
13200 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
13210 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
13220 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
13230 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
13240 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
13250 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
13260 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
13270 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
13280 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
13290 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
132a0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
132b0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
132c0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
132d0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
132e0 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
132f0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
13300 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
13310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
13320 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
13330 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
13340 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
13350 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
13360 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
13370 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
13380 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
13390 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
133a0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
133b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
133c0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
133d0 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
133e0 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
133f0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13400 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
13410 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
13420 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
13430 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
13440 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
13450 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
13460 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
13470 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
13480 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13490 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
134a0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
134b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
134c0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
134d0 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
134e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
134f0 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
13500 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
13510 20 20 20 20 69 73 55 6e 73 79 6e 63 20 3d 20 31      isUnsync = 1
13520 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13530 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
13540 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
13550 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
13560 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
13570 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
13580 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
13590 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
135a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
135b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
135c0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
135d0 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
135e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
135f0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
13600 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
13610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13620 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
13630 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
13640 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
13650 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
13660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
13670 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
13680 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
13690 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
136a0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
136b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
136c0 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
136d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
136e0 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
136f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
13700 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
13710 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
13720 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
13730 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
13740 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
13750 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
13760 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
13770 67 65 28 70 50 61 67 65 72 2c 31 2c 69 73 55 6e  ge(pPager,1,isUn
13780 73 79 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  sync,&pPager->jo
13790 75 72 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20  urnalOff,0,0);. 
137a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
137b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
137c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
137d0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
137e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
137f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
13800 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13810 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
13820 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13840 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
13850 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
13860 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
13870 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
13880 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
13890 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
138a0 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
138b0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
138c0 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
138d0 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
138e0 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
138f0 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
13900 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
13910 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
13920 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
13930 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
13940 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
13950 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
13960 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
13970 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
13980 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13990 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
139a0 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
139b0 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
139c0 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
139d0 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
139e0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
139f0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
13a00 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
13a10 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
13a20 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
13a30 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
13a40 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
13a50 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
13a60 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
13a70 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
13a80 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
13a90 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
13aa0 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
13ab0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
13ac0 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
13ad0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20   */.  assert(.  
13ae0 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d    pPager->fd->pM
13af0 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20  ethods==0 ||.   
13b00 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
13b10 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
13b20 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
13b30 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53  _UNCHANGED,0)>=S
13b40 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20  QLITE_OK.  );.. 
13b50 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
13b60 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
13b70 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
13b80 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
13b90 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
13ba0 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
13bb0 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
13bc0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
13bd0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
13be0 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
13bf0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
13c00 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
13c10 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
13c20 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
13c30 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
13c40 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
13c50 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
13c60 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
13c70 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
13c80 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
13c90 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
13ca0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
13cb0 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
13cc0 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
13cd0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
13ce0 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
13cf0 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
13d00 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
13d10 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
13d20 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
13d30 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
13d40 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
13d50 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
13d60 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
13d70 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
13d80 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
13d90 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
13da0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13db0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
13dc0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
13dd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13de0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
13df0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
13e00 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
13e10 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
13e20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
13e30 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
13e40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13e50 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
13e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13e70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
13e80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
13e90 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
13ea0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
13eb0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
13ec0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
13ed0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
13ee0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
13ef0 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
13f00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13f10 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
13f20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
13f30 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
13f40 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
13f50 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
13f60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
13f70 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
13f80 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
13f90 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
13fa0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
13fb0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
13fc0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
13fd0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
13fe0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
13ff0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
14000 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
14010 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
14020 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
14030 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
14040 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
14050 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
14060 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14070 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
14080 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
14090 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
140a0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
140b0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
140c0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
140d0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
140e0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
140f0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
14100 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
14110 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
14120 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
14130 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
14140 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
14150 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
14160 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14170 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
14180 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
14190 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
141a0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
141b0 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
141c0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
141d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
141e0 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
141f0 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
14200 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
14210 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
14220 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
14230 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
14240 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
14250 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
14260 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
14270 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
14280 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
14290 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
142a0 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
142b0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
142c0 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
142d0 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
142e0 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
142f0 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
14300 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
14310 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
14320 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
14330 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
14340 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
14350 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
14360 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
14370 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
14380 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
14390 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
143a0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
143b0 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
143c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
143d0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
143e0 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
143f0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14400 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
14410 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
14420 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14430 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
14440 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
14450 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
14460 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
14470 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
14480 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
14490 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
144a0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
144b0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
144c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
144d0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
144e0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
144f0 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
14500 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
14510 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
14520 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
14530 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
14540 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
14550 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
14560 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
14570 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
14580 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
14590 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
145a0 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
145b0 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
145c0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
145d0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
145e0 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
145f0 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
14600 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
14610 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
14620 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14630 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
14640 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
14650 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
14660 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
14670 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
14680 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
14690 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
146a0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
146b0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
146c0 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
146d0 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
146e0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
146f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
14700 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
14710 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
14720 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
14730 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
14740 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
14750 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
14760 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
14770 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
14780 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
14790 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
147a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
147b0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
147c0 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
147d0 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
147e0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
147f0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
14800 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
14810 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
14820 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
14830 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
14840 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14850 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
14860 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
14870 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
14880 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
14890 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
148c0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
148d0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
148e0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
148f0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
14900 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
14910 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
14920 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
14930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14940 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14950 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
14960 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
14970 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
14980 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
14990 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
149a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
149b0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
149c0 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f  R_SHARED );..  /
149d0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
149e0 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
149f0 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
14a00 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
14a10 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
14a20 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
14a30 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
14a40 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
14a50 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
14a60 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
14a70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14a80 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
14a90 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
14aa0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
14ab0 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
14ac0 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
14ad0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
14ae0 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
14af0 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
14b00 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
14b10 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
14b20 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
14b30 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
14b40 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a  bOrigSize;..  /*
14b50 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
14b60 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
14b70 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
14b80 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
14b90 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
14ba0 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
14bb0 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
14bc0 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
14bd0 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
14be0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
14bf0 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
14c00 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
14c10 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
14c20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
14c30 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
14c40 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
14c50 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
14c60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
14c70 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
14c80 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
14c90 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
14ca0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
14cb0 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
14cc0 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
14cd0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
14ce0 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
14cf0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
14d00 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
14d10 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
14d20 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
14d30 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
14d40 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
14d50 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
14d60 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
14d70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
14d80 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
14d90 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
14da0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
14db0 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
14dc0 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
14dd0 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
14de0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
14df0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
14e00 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
14e10 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
14e20 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
14e30 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
14e40 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
14e50 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
14e60 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
14e70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
14e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
14e90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14ea0 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
14eb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
14ec0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
14ed0 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50  Pager, 1, 0, &pP
14ee0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14ef0 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20  , 1, pDone);.   
14f00 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
14f10 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
14f20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14f30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14f40 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
14f50 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
14f60 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
14f70 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
14f80 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
14f90 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
14fa0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
14fb0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
14fc0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
14fd0 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
14fe0 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
14ff0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
15000 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
15010 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
15020 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
15030 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
15040 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
15050 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
15060 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
15070 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
15080 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
15090 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
150a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
150b0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
150c0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
150d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
150e0 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
150f0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
15100 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
15110 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
15120 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
15130 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
15140 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15150 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
15160 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
15170 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
15180 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
15190 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
151a0 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
151b0 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
151c0 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
151d0 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
151e0 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
151f0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
15200 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
15210 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
15220 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
15230 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
15240 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
15250 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
15260 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
15270 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
15280 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
15290 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
152a0 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
152b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
152c0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
152d0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
152e0 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
152f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
15300 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
15310 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
15320 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
15330 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
15340 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
15350 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d  , 1, 0, &pPager-
15360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
15370 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pDone);.    }.  
15380 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15390 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
153a0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
153b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
153c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
153d0 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
153e0 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
153f0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
15400 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
15410 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
15420 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
15430 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
15440 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15450 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
15460 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
15470 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
15480 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
15490 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
154a0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
154b0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
154c0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
154d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
154e0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
154f0 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f  offset = pSavepo
15500 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
15510 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15520 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53  );.    for(ii=pS
15530 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
15540 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
15550 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
15560 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
15570 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
15580 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65  set==ii*(4+pPage
15590 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
155a0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
155b0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
155c0 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20 30 2c  ge(pPager, 0, 0,
155d0 20 26 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f   &offset, 1, pDo
155e0 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
155f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15600 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
15610 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
15620 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
15630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15640 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
15650 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
15660 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  J;.  }.  return 
15670 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
15680 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
15690 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
156a0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
156b0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
156c0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
156d0 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
156e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
156f0 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
15700 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
15710 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
15720 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
15730 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
15740 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
15750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
15760 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
15770 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
15780 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
15790 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
157a0 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
157b0 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
157c0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
157d0 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
157e0 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
157f0 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
15800 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
15810 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
15820 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
15830 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
15840 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
15850 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
15860 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
15870 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
15880 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
15890 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
158a0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
158b0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
158c0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
158d0 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
158e0 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
158f0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
15900 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
15910 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
15920 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
15930 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
15940 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
15950 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
15960 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
15970 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
15980 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
15990 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
159a0 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
159b0 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
159c0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
159d0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
159e0 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
159f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
15a00 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
15a10 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
15a20 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
15a30 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
15a50 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
15a60 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
15a70 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
15a80 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
15a90 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
15aa0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15ab0 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
15ac0 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
15ad0 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
15ae0 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
15af0 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
15b00 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
15b10 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
15b20 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
15b30 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
15b40 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
15b60 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
15b70 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
15b80 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
15b90 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
15ba0 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
15bb0 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
15bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
15bd0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
15be0 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
15bf0 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
15c00 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
15c10 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
15c20 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
15c30 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
15c40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
15c50 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
15c60 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
15c70 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
15c80 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
15c90 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
15ca0 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
15cb0 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
15cc0 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
15cd0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
15ce0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
15cf0 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
15d00 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
15d10 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
15d20 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
15d30 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c   (bFullFsync?SQL
15d40 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
15d50 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
15d60 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15d70 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
15d80 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
15d90 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15da0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
15db0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
15dc0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
15dd0 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
15de0 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
15df0 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
15e00 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
15e10 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
15e20 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
15e30 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
15e40 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
15e50 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
15e60 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
15e70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
15e80 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
15e90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
15ea0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
15eb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15ec0 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
15ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
15ee0 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
15ef0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
15f00 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
15f10 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
15f20 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
15f30 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
15f40 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
15f50 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
15f60 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
15f70 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
15f80 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
15f90 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
15fa0 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
15fb0 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
15fc0 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
15fd0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
15fe0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
15ff0 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
16000 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16010 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
16020 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
16030 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
16040 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
16050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
16060 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
16070 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
16080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
16090 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
160a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
160b0 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
160c0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
160d0 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
160e0 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
160f0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
16100 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
16110 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
16120 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16130 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16140 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
16150 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
16160 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
16170 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
16180 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
16190 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
161a0 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
161b0 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
161c0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
161d0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
161e0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
161f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
16200 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
16210 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
16220 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16230 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
16240 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
16250 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
16260 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
16270 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
16280 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
16290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
162a0 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
162b0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
162c0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
162d0 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
162e0 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
162f0 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
16300 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
16310 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
16320 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
16330 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
16340 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
16350 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
16360 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
16370 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
16380 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
16390 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
163a0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
163b0 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
163c0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
163d0 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
163e0 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
163f0 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
16400 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
16410 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
16420 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
16430 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
16440 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
16450 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
16480 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
16490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164c0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
164d0 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
164e0 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
164f0 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
16500 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
16510 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
16520 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
16530 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
16540 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
16550 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
16560 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
16570 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
16580 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
16590 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
165a0 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
165b0 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
165c0 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
165d0 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
165e0 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
165f0 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
16600 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
16610 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
16620 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
16630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
16640 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
16650 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16660 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16670 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
16680 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
16690 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
166a0 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
166b0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
166c0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
166d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
166e0 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
166f0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
16700 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
16710 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
16720 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70  dler */.){  .  p
16730 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
16740 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
16750 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
16760 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
16770 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
16780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
16790 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
167a0 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
167b0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
167c0 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
167d0 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
167e0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
167f0 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
16800 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16810 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16820 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
16830 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
16840 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
16850 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
16860 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
16870 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
168a0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
168b0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
168c0 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
168d0 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
168e0 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
168f0 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
16900 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
16910 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
16920 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
16930 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
16940 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
16950 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
16960 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
16970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
16980 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
16990 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
169a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
169b0 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
169c0 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
169d0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
169e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
169f0 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
16a00 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
16a10 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
16a20 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c  E_CORRUPT or SQL
16a30 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
16a40 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
16a50 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
16a60 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
16a70 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
16a80 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
16a90 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
16aa0 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
16ab0 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
16ac0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
16ad0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
16ae0 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
16af0 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
16b00 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
16b10 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
16b20 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
16b30 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
16b40 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
16b50 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
16b60 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
16b70 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
16b80 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
16b90 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
16ba0 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
16bb0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
16bc0 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
16bd0 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
16be0 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
16bf0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
16c00 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
16c10 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
16c20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
16c30 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
16c40 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
16c50 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
16c60 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
16c70 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
16c80 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
16c90 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
16ca0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
16cb0 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
16cc0 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
16cd0 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
16ce0 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
16cf0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16d00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
16d10 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
16d20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
16d30 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
16d40 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
16d50 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
16d60 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
16d70 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
16d80 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
16d90 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
16da0 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
16db0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
16dc0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
16dd0 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
16de0 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
16df0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
16e00 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
16e10 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
16e20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
16e30 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
16e40 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
16e50 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50  *pPager, u16 *pP
16e60 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
16e70 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
16e80 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
16e90 64 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  de;..  if( rc==S
16ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16eb0 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u16 pageSize = *
16ec0 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  pPageSize;.    a
16ed0 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
16ee0 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
16ef0 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
16f00 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
16f10 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69  E_SIZE) );.    i
16f20 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( (pPager->memD
16f30 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
16f40 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20  dbSize==0).     
16f50 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
16f60 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
16f70 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
16f80 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
16f90 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67  & pageSize!=pPag
16fa0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
16fb0 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20    ){.      char 
16fc0 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29  *pNew = (char *)
16fd0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
16fe0 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
16ff0 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a     if( !pNew ){.
17000 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17010 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
17020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17030 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
17040 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
17050 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
17060 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
17070 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
17080 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
17090 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ace);.        pP
170a0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
170b0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
170c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
170d0 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
170e0 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
170f0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
17100 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a   }.    *pPageSiz
17110 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  e = (u16)pPager-
17120 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69  >pageSize;.    i
17130 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20  f( nReserve<0 ) 
17140 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65  nReserve = pPage
17150 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  r->nReserve;.   
17160 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
17170 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
17180 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61  <1000 );.    pPa
17190 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
171a0 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
171b0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
171c0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
171d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
171e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
171f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
17200 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
17210 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
17220 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
17230 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
17240 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
17250 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
17260 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
17270 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
17280 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
17290 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
172a0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
172b0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
172c0 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
172d0 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
172e0 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
172f0 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
17300 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
17310 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
17320 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
17330 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
17340 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
17350 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
17360 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
17370 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
17380 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
17390 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
173a0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
173b0 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
173c0 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
173d0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
173e0 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
173f0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
17400 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
17410 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
17420 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
17430 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
17440 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
17450 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
17460 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
17470 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
17480 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
17490 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
174a0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
174b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
174c0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
174d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
174e0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
174f0 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
17500 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
17510 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
17520 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
17530 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
17540 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
17550 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
17560 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
17570 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
17580 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
17590 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
175a0 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
175b0 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
175c0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
175d0 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
175e0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
175f0 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
17600 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
17610 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
17620 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
17630 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
17640 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
17650 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
17660 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
17670 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
17680 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
17690 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
176a0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
176b0 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
176c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
176d0 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
176e0 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
176f0 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
17700 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17710 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
17720 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
17730 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
17740 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
17750 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
17760 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
17770 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
17780 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
17790 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
177a0 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
177b0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
177c0 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
177d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
177e0 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
177f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
17800 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
17810 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
17820 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
17830 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
17840 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
17850 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
17860 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
17870 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
17880 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
17890 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
178a0 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
178b0 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
178c0 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
178d0 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
178e0 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
178f0 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
17900 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
17910 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
17920 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
17930 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
17940 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
17950 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
17960 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
17970 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
17980 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
17990 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
179a0 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
179b0 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
179c0 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
179d0 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
179e0 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
179f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
17a00 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
17a10 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
17a20 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
17a30 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
17a40 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
17a50 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
17a60 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
17a70 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
17a80 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
17a90 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
17aa0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
17ab0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
17ac0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
17ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
17ae0 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
17af0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
17b00 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
17b10 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
17b20 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  le );.  if( isOp
17b30 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
17b40 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
17b50 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
17b60 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
17b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17b80 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
17b90 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
17ba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17bb0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
17bc0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
17bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17be0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17bf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17c00 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
17c10 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
17c20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17c30 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  e associated .**
17c40 20 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e 6f   with pPager. No
17c50 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  rmally, this is 
17c60 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28 3c  calculated as (<
17c70 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70  db file size>/<p
17c80 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48  age-size>)..** H
17c90 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
17ca0 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
17cb0 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
17cc0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
17cd0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
17ce0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
17cf0 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  page file..**.**
17d00 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
17d10 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
17d20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
17d30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
17d40 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  en the.** error 
17d50 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
17d60 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
17d70 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75 6e   *pnPage left un
17d80 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20  changed. Or,.** 
17d90 69 66 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  if the file syst
17da0 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75 65  em has to be que
17db0 72 69 65 64 20 66 6f 72 20 74 68 65 20 73 69 7a  ried for the siz
17dc0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  e of the file an
17dd0 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20 61  d.** the query a
17de0 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20 61  ttempt returns a
17df0 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65 20  n IO error, the 
17e00 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
17e10 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
17e20 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
17e30 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
17e40 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
17e50 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
17e60 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 53  ccessful, then S
17e70 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
17e80 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50  rned.** and *pnP
17e90 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  age is set to th
17ea0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
17eb0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
17ec0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17ed0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17ee0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
17ef0 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50  nt *pnPage){.  P
17f00 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
17f10 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
17f20 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
17f30 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
17f40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
17f50 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
17f60 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
17f70 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
17f80 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  de. */.  if( pPa
17f90 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
17fa0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
17fb0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
17fc0 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
17fd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
17fe0 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  ges in the file.
17ff0 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e   Store this in n
18000 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  Page. */.  if( p
18010 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
18020 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  id ){.    nPage 
18030 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
18040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
18050 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18060 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
18070 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69  returned by OsFi
18080 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20  leSize() */.    
18090 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
180a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
180b0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65  size in bytes re
180c0 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
180d0 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61  Size() */..    a
180e0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
180f0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
18100 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
18110 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
18120 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20 28  pPager->fd) && (
18130 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
18140 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
18150 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29  ger->fd, &n))) )
18160 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
18170 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
18180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
181a0 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
181b0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
181c0 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20     nPage = 1;.  
181d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
181e0 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20  Page = (Pgno)(n 
181f0 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
18200 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
18210 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18220 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
18230 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18240 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
18250 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
18260 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
18270 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
18280 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b  dbSizeValid = 1;
18290 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
182a0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
182b0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
182c0 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67  in the file is g
182d0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
182e0 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
182f0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
18300 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
18310 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
18320 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
18330 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
18340 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
18350 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
18360 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
18370 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
18380 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
18390 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
183a0 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  ut variable and 
183b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
183c0 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67 65   */.  if( pnPage
183d0 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20   ){.    *pnPage 
183e0 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72  = nPage;.  }.  r
183f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18400 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
18410 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
18420 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
18430 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18440 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
18450 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
18460 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
18470 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
18480 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18490 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
184a0 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
184b0 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
184c0 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
184d0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
184e0 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
184f0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
18500 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
18510 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
18520 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
18530 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
18540 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
18550 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
18560 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
18570 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
18580 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
18590 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
185a0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
185b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
185c0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
185d0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
185e0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
185f0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
18600 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
18610 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
18620 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
18630 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
18640 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
18650 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
18660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18670 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
18680 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
18690 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
186a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
186b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
186d0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
186e0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
186f0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
18700 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
18710 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
18720 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
18730 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
18740 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
18750 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
18760 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
18770 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
18780 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
18790 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
187a0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
187b0 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
187c0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
187d0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
187e0 77 6e 2e 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74  wn. It.  ** must
187f0 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6d   not have been m
18800 6f 64 69 66 69 65 64 20 61 74 20 74 68 69 73 20  odified at this 
18810 70 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  point..  */.  as
18820 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18830 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
18840 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
18850 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20  izeValid==0 );. 
18860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18870 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
18880 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
18890 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b  dbModified==0 );
188a0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
188b0 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
188c0 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
188d0 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
188e0 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
188f0 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f  ready held, or o
18900 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
18910 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  stions that the 
18920 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
18930 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
18940 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
18950 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
18960 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
18970 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
18980 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
18990 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
189a0 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
189b0 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
189c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
189d0 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f  GER_UNLOCK && lo
189e0 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48  cktype==PAGER_SH
189f0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
18a00 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
18a10 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 26  PAGER_RESERVED &
18a20 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45  & locktype==PAGE
18a30 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29  R_EXCLUSIVE).  )
18a40 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
18a50 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
18a60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
18a70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
18a80 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
18a90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
18aa0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
18ab0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
18ac0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
18ad0 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
18ae0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
18af0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
18b00 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66  erArg) );.    if
18b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18b20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
18b30 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63  >state = (u8)loc
18b40 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
18b50 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
18b60 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
18b70 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
18b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18b90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
18ba0 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
18bb0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
18bc0 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
18bd0 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
18be0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
18bf0 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
18c00 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
18c10 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
18c20 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
18c30 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
18c40 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
18c50 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
18c60 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
18c70 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
18c80 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
18c90 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
18ca0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
18cb0 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
18cc0 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
18cd0 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
18ce0 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
18cf0 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
18d00 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
18d10 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
18d20 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
18d30 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
18d40 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
18d50 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
18d60 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
18d70 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
18d80 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
18d90 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
18da0 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
18db0 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
18dc0 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
18dd0 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
18de0 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
18df0 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
18e00 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
18e10 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
18e20 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
18e30 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
18e40 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
18e50 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
18e60 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
18e70 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
18e80 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
18e90 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75 72  orrect behaviour
18ea0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
18eb0 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
18ec0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
18ed0 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
18ee0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
18ef0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
18f00 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
18f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18f20 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
18f30 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
18f40 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
18f50 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
18f60 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
18f70 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
18f80 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
18f90 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
18fa0 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
18fb0 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
18fc0 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
18fd0 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
18fe0 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
18ff0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
19000 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
19010 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
19020 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
19030 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
19040 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
19050 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
19060 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
19070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
19080 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
19090 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
190a0 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
190b0 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
190c0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
190d0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
190e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
190f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
19100 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
19110 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
19120 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
19130 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
19140 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
19150 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
19160 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
19170 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
19180 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
19190 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
191a0 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
191b0 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
191c0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
191d0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
191e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
191f0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
19200 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
19210 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
19220 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
19230 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
19240 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
19250 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
19260 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
19270 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
19280 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itted..*/.void s
19290 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
192a0 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
192b0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
192c0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
192d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
192e0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
192f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
19300 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
19310 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19320 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19330 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
19340 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
19350 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
19360 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
19370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
19380 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
19390 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
193a0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
193b0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
193c0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
193d0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
193e0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
193f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
19400 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
19410 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
19420 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
19430 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
19440 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
19450 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
19460 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
19470 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
19480 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
19490 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
194a0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
194b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
194c0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
194d0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
194e0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
194f0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
19500 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
19510 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
19520 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
19530 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
19540 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
19550 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
19560 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
19570 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
19580 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
19590 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
195a0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
195b0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
195c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
195d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
195e0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
195f0 50 61 67 65 72 29 7b 0a 20 20 64 69 73 61 62 6c  Pager){.  disabl
19600 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
19610 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
19620 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
19630 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d  loc();.  pPager-
19640 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
19650 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
19660 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67  eMode = 0;.  pag
19670 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
19680 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
19690 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
196a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
196b0 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 50  se{.    /* Set P
196c0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20  ager.journalHdr 
196d0 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62 65  to -1 for the be
196e0 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61 67  nefit of the pag
196f0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a 20  er_playback() . 
19700 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68     ** call which
19710 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72 6f   may be made fro
19720 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55 6e  m within pagerUn
19730 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
19740 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a 20  ). If it.    ** 
19750 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20  is not -1, then 
19760 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f 72  the unsynced por
19770 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20  tion of an open 
19780 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
19790 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79 65  .    ** be playe
197a0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
197b0 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
197c0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
197d0 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  urs while.    **
197e0 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
197f0 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
19800 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72 72   may become corr
19810 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  upt..    */.    
19820 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
19830 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 70 61 67  dr = -1;.    pag
19840 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
19850 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
19860 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
19870 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65  ignMalloc();.  e
19880 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
19890 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50  io_errors();.  P
198a0 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53  AGERTRACE(("CLOS
198b0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
198c0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f  (pPager)));.  IO
198d0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
198e0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
198f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
19900 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
19910 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
19920 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
19930 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
19940 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
19950 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
19960 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
19970 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
19980 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
19990 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
199a0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
199b0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
199c0 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
199d0 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
199e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
199f0 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
19a00 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
19a10 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
19a20 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
19a30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
19a40 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
19a50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
19a60 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
19a70 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
19a80 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
19a90 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
19aa0 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
19ab0 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
19ac0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
19ad0 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
19ae0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
19af0 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
19b00 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
19b10 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
19b20 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
19b30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19b40 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
19b50 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
19b60 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
19b70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
19b80 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
19b90 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
19ba0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
19bb0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
19bc0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
19bd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
19be0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
19bf0 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
19c00 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
19c10 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
19c20 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
19c30 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
19c40 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
19c50 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
19c60 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74  Sync flag is not
19c70 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
19c80 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a  function is a.**
19c90 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
19ca0 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
19cb0 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
19cc0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
19cd0 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65  de.** and the de
19ce0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
19cf0 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20  tics of the the 
19d00 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
19d10 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
19d20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
19d30 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
19d40 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
19d50 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
19d60 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
19d70 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
19d80 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
19d90 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
19da0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
19db0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
19dc0 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
19dd0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
19de0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
19df0 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
19e00 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
19e10 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
19e20 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
19e30 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
19e40 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
19e50 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
19e60 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
19e70 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
19e80 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
19e90 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
19ea0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
19eb0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
19ec0 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
19ed0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
19ee0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
19ef0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
19f00 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
19f10 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
19f20 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
19f30 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
19f40 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
19f50 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
19f60 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
19f70 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
19f80 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
19f90 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
19fa0 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
19fb0 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
19fc0 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
19fd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
19fe0 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
19ff0 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
1a000 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
1a010 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
1a020 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
1a030 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
1a040 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
1a050 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
1a060 73 20 6e 65 76 65 72 20 62 65 20 73 65 74 20 66  s never be set f
1a070 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1a080 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69  es, or any.** fi
1a090 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  le operating in 
1a0a0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61  no-sync mode (Pa
1a0b0 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74  ger.noSync set t
1a0c0 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a  o non-zero)..**.
1a0d0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1a0e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1a0f0 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
1a100 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
1a110 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
1a120 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1a130 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
1a140 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
1a150 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
1a160 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
1a170 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
1a180 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1a190 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
1a1a0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1a1b0 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
1a1c0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1a1d0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
1a1e0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
1a1f0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1a200 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1a210 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1a220 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
1a230 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
1a240 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e  MORY ){.      in
1a250 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1a280 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
1a290 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1a2a0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1a2b0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1a2c0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
1a2d0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1a2e0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
1a2f0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
1a300 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1a310 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1a320 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
1a330 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
1a340 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
1a350 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
1a360 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
1a370 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
1a380 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1a390 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
1a3a0 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
1a3b0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
1a3c0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
1a3d0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
1a3e0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
1a3f0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
1a400 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
1a410 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
1a420 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
1a430 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
1a440 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1a450 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
1a460 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
1a470 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
1a480 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
1a490 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
1a4a0 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  us connections t
1a4b0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
1a4c0 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
1a4d0 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
1a4e0 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
1a4f0 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
1a500 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
1a510 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
1a520 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
1a530 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
1a540 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1a550 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
1a560 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
1a570 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1a580 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
1a590 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
1a5a0 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
1a5b0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
1a5c0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
1a5d0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
1a5e0 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
1a5f0 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
1a600 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1a610 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
1a620 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
1a630 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
1a640 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
1a650 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
1a660 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
1a670 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
1a680 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
1a690 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1a6a0 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
1a6b0 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
1a6c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
1a6d0 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
1a6e0 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
1a6f0 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
1a700 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
1a710 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
1a720 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
1a730 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
1a740 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
1a750 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
1a760 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
1a770 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
1a780 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
1a790 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
1a7a0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1a7b0 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
1a7c0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
1a7d0 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
1a7e0 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
1a7f0 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
1a800 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
1a810 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
1a820 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
1a830 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
1a840 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
1a850 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
1a860 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
1a870 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
1a880 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1a890 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
1a8a0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
1a8b0 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 09 75 38 20   aMagic[8];..u8 
1a8c0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
1a8d0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
1a8e0 3b 0a 0a 09 6d 65 6d 63 70 79 28 7a 48 65 61 64  ;...memcpy(zHead
1a8f0 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
1a900 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
1a910 61 6c 4d 61 67 69 63 29 29 3b 0a 09 70 75 74 33  alMagic));..put3
1a920 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
1a930 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1a940 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
1a950 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
1a960 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
1a970 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
1a980 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1a990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a9a0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
1a9b0 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
1a9c0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
1a9d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a9e0 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
1a9f0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
1aa00 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
1aa10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
1aa20 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
1aa30 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
1aa40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1aa50 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1aa60 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
1aa70 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
1aa80 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1aa90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1aaa0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1aab0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1aac0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1aad0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1aae0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1aaf0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1ab00 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
1ab10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ab20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
1ab30 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
1ab40 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
1ab50 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
1ab60 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
1ab70 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
1ab80 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
1ab90 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
1aba0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
1abb0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
1abc0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
1abd0 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
1abe0 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
1abf0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1ac00 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
1ac10 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
1ac20 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
1ac30 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
1ac40 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
1ac50 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
1ac60 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
1ac70 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
1ac80 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
1ac90 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
1aca0 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
1acb0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
1acc0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
1acd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
1ace0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
1acf0 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
1ad00 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1ad10 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
1ad20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
1ad30 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1ad40 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
1ad50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1ad60 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1ad70 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1ad80 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1ad90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
1ada0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1adb0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1adc0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1add0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
1ade0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
1adf0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1ae00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1ae10 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1ae20 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1ae30 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
1ae40 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1ae50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1ae60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1ae70 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
1ae80 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
1ae90 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
1aea0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
1aeb0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1aec0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1aee0 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
1aef0 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
1af00 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
1af10 61 6c 48 64 72 0a 09 29 3b 0a 20 20 20 20 20 20  alHdr..);.      
1af20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1af30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1af40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1af50 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1af60 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1af70 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
1af80 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1af90 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1afa0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1afb0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
1afc0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
1afd0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
1afe0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1aff0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1b000 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1b010 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
1b020 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
1b030 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
1b040 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
1b050 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
1b060 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
1b070 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b080 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b090 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1b0a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a   }..    /* The j
1b0b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
1b0c0 6a 75 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c  just successfull
1b0d0 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61  y synced. Set Pa
1b0e0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20  ger.needSync .  
1b0f0 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64    ** to zero and
1b100 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
1b110 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
1b120 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20  on all pagess.. 
1b130 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1b140 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1b150 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b160 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
1b170 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1b180 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
1b190 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1b1a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1b1b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1b1c0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
1b1d0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
1b1e0 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
1b1f0 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f  f dirty pages co
1b200 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68  nnected.** by th
1b210 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
1b220 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ointer. This fun
1b230 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63  ction writes eac
1b240 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  h one of the.** 
1b250 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
1b260 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74  in the list to t
1b270 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b280 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  . The argument m
1b290 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72  ay.** be NULL, r
1b2a0 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65  epresenting an e
1b2b0 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68  mpty list. In th
1b2c0 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
1b2d0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f  ction is.** a no
1b2e0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
1b2f0 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ager must hold a
1b300 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
1b310 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69  ED lock when thi
1b320 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
1b330 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20   called. Before 
1b340 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67  writing anything
1b350 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b360 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b   file, this lock
1b370 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20  .** is upgraded 
1b380 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
1b390 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
1b3a0 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
1b3b0 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ined,.** SQLITE_
1b3c0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
1b3d0 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20   and no data is 
1b3e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1b3f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1b400 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65   .** If the page
1b410 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  r is a temp-file
1b420 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61   pager and the a
1b430 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65  ctual file-syste
1b440 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74  m file.** is not
1b450 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   yet open, it is
1b460 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65   created and ope
1b470 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  ned before any d
1b480 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ata is .** writt
1b490 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  en out..**.** On
1b4a0 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  ce the lock has 
1b4b0 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e  been upgraded an
1b4c0 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
1b4d0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1b4e0 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61  ,.** the pages a
1b4f0 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  re written out t
1b500 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b510 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65  ile in list orde
1b520 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20  r. Writing.** a 
1b530 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20  page is skipped 
1b540 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68  if it meets eith
1b550 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  er of the follow
1b560 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a  ing criteria:.**
1b570 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
1b580 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
1b590 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  er than Pager.db
1b5a0 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  Size, or.**   * 
1b5b0 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  The PGHDR_DONT_W
1b5c0 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  RITE flag is set
1b5d0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
1b5e0 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f  .** If writing o
1b5f0 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73  ut a page causes
1b600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b610 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65  le to grow, Page
1b620 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20  r.dbFileSize.** 
1b630 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
1b640 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20  dingly. If page 
1b650 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74  1 is written out
1b660 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1b670 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61   cached.** in Pa
1b680 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1b690 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
1b6a0 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c  atch the new val
1b6b0 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
1b6c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b6d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
1b6e0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
1b6f0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
1b700 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1b710 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
1b720 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
1b730 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b740 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
1b750 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1b760 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74  cannot.** be obt
1b770 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55  ained, SQLITE_BU
1b780 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
1b790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1b7a0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1b7b0 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
1b7c0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1b7d0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1b7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1b7f0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
1b800 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1b830 65 20 2a 2f 0a 0a 20 20 69 66 28 20 4e 45 56 45  e */..  if( NEVE
1b840 52 28 70 4c 69 73 74 3d 3d 30 29 20 29 20 72 65  R(pList==0) ) re
1b850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b860 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
1b870 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
1b880 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1b890 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
1b8a0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
1b8b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1b8c0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
1b8d0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1b8e0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
1b8f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
1b900 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
1b910 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f   ** call is a no
1b920 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  -op..  **.  ** M
1b930 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66  oving the lock f
1b940 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20  rom RESERVED to 
1b950 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c  EXCLUSIVE actual
1b960 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e  ly involves goin
1b970 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  g.  ** through a
1b980 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  n intermediate s
1b990 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20  tate PENDING.   
1b9a0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70  A PENDING lock p
1b9b0 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a  revents new.  **
1b9c0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74   readers from at
1b9d0 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64  taching to the d
1b9e0 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75  atabase but is u
1b9f0 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20  nsufficient for 
1ba00 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65  us to.  ** write
1ba10 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61  .  The idea of a
1ba20 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
1ba30 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20   to prevent new 
1ba40 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a  readers from.  *
1ba50 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c  * coming in whil
1ba60 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78  e we wait for ex
1ba70 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74  isting readers t
1ba80 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20  o clear..  **.  
1ba90 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  ** While the pag
1baa0 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53  er is in the RES
1bab0 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
1bac0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
1bad0 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  se file.  ** is 
1bae0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65  unchanged and we
1baf0 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69   can rollback wi
1bb00 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1bb10 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a  playback the.  *
1bb20 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  * journal into t
1bb30 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1bb40 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65  base file.  Once
1bb50 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74   we transition t
1bb60 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  o.  ** EXCLUSIVE
1bb70 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64  , it means the d
1bb80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
1bb90 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e   been changed an
1bba0 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20  d any rollback. 
1bbb0 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65   ** will require
1bbc0 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62   a journal playb
1bbd0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ack..  */.  asse
1bbe0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1bbf0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1bc00 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  D );.  rc = page
1bc10 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
1bc20 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
1bc30 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66  _LOCK);..  /* If
1bc40 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
1bc50 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
1bc60 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
1bc70 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
1bc80 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
1bc90 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
1bca0 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
1bcb0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
1bcc0 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
1bcd0 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
1bce0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
1bcf0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
1bd00 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
1bd10 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
1bd20 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1bd30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1bd40 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
1bd50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
1bd60 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
1bd70 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
1bd80 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
1bd90 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
1bda0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1bdb0 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
1bdc0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1bdd0 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
1bde0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1bdf0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
1be00 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1be10 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
1be20 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
1be30 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
1be40 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
1be50 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
1be60 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
1be70 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
1be80 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
1be90 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
1bea0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
1beb0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
1bec0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
1bed0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
1bee0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1bef0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
1bf00 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
1bf10 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
1bf20 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
1bf30 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
1bf40 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
1bf50 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
1bf60 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
1bf70 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
1bf80 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
1bf90 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
1bfa0 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
1bfb0 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
1bfc0 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
1bfd0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1bfe0 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
1bff0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
1c000 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
1c010 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
1c040 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
1c050 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
1c060 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1c070 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
1c080 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
1c090 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
1c0a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
1c0b0 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
1c0c0 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
1c0d0 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
1c0e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c0f0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1c100 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
1c110 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
1c120 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
1c130 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
1c140 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
1c150 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
1c160 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
1c170 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1c180 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
1c190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c1a0 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
1c1b0 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
1c1c0 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
1c1d0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1c1e0 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
1c1f0 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
1c200 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
1c210 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1c220 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1c230 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
1c240 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
1c250 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1c260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c270 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
1c280 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
1c290 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c2a0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
1c2b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1c2c0 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
1c2d0 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
1c2e0 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
1c2f0 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
1c300 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1c310 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1c320 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1c330 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
1c340 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
1c350 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
1c360 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
1c370 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c3a0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
1c3b0 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
1c3c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1c3d0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
1c3e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1c3f0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1c400 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
1c410 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
1c420 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1c430 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b  pPager->nWrite);
1c440 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c450 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
1c460 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
1c470 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c480 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
1c490 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1c4a0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1c4b0 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
1c4c0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1c4d0 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
1c4e0 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
1c4f0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1c500 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1c510 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1c520 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
1c530 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1c540 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
1c550 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
1c560 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
1c570 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
1c580 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
1c590 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
1c5a0 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
1c5b0 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
1c5c0 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
1c5d0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1c5e0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
1c5f0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1c600 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
1c610 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
1c620 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
1c630 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
1c640 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
1c650 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1c660 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
1c670 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1c680 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
1c690 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
1c6a0 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
1c6b0 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
1c6c0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
1c6d0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
1c6e0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
1c6f0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
1c700 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
1c710 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
1c720 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
1c730 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
1c740 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
1c750 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
1c760 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1c770 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1c780 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1c790 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73 4f  Pager;.  if( isO
1c7a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
1c7b0 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ) ){.    void *p
1c7c0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
1c7d0 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  a;.    i64 offse
1c7e0 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  t = pPager->nSub
1c7f0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
1c800 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63 68  ageSize);.    ch
1c810 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
1c820 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1c830 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1c840 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
1c850 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
1c860 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  );.    PAGERTRAC
1c870 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
1c880 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1c890 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c8a0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1c8b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
1c8c0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
1c8d0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
1c8e0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
1c8f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  );.    rc = writ
1c900 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
1c910 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
1c920 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
1c930 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c940 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1c950 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1c960 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
1c970 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
1c980 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
1c990 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1c9a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c9b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
1c9c0 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
1c9d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
1c9e0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
1c9f0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
1ca00 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
1ca10 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
1ca20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ca30 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1ca40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1ca50 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
1ca60 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
1ca70 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
1ca80 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
1ca90 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
1caa0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1cab0 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
1cac0 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
1cad0 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
1cae0 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
1caf0 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
1cb00 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
1cb10 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
1cb20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1cb30 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
1cb40 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
1cb50 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
1cb60 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
1cb70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1cb80 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
1cb90 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
1cba0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1cbb0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
1cbc0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1cbd0 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
1cbe0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
1cbf0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1cc00 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
1cc10 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
1cc20 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
1cc30 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1cc40 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
1cc50 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
1cc60 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
1cc70 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
1cc80 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
1cc90 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
1cca0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1ccb0 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
1ccc0 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
1ccd0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
1cce0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1ccf0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1cd00 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
1cd10 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
1cd20 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
1cd30 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1cd40 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
1cd50 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
1cd60 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
1cd70 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
1cd80 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1cd90 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
1cda0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
1cdb0 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
1cdc0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
1cdd0 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
1cde0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1cdf0 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
1ce00 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1ce10 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1ce20 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
1ce30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ce40 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1ce50 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
1ce60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1ce70 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1ce80 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
1ce90 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 69  doNotSync flag i
1cea0 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71 6c  s set by the sql
1ceb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1cec0 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
1ced0 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e  it.  ** is journ
1cee0 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66 20  alling a set of 
1cef0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74 61  two or more data
1cf00 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74 20  base pages that 
1cf10 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a 20  are stored.  ** 
1cf20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b  on the same disk
1cf30 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67   sector. Syncing
1cf40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1cf50 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c  not allowed whil
1cf60 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68  e.  ** this is h
1cf70 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
1cf80 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1cf90 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
1cfa0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74 20  such a.  ** set 
1cfb0 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79 6e  of pages are syn
1cfc0 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65  ced to disk toge
1cfd0 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65  ther. So, if the
1cfe0 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63 74   page this funct
1cff0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79 69  ion.  ** is tryi
1d000 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e  ng to make clean
1d010 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
1d020 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64  journal sync and
1d030 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20   the doNotSync. 
1d040 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
1d050 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1d060 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
1d070 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  The pcache layer
1d080 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74 20   will.  ** just 
1d090 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64  have to go ahead
1d0a0 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
1d0b0 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72 20  new page buffer 
1d0c0 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20  instead of.  ** 
1d0d0 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20 2a  reusing pPg..  *
1d0e0 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79  *.  ** Similarly
1d0f0 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68  , if the pager h
1d100 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
1d110 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
1d120 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20  te, do not.  ** 
1d130 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
1d140 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
1d150 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   to disk..  */. 
1d160 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
1d170 72 2d 3e 65 72 72 43 6f 64 65 29 0a 20 20 20 7c  r->errCode).   |
1d180 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  | (pPager->doNot
1d190 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c 61  Sync && pPg->fla
1d1a0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1d1b0 4e 43 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  NC).  ){.    ret
1d1c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d1d0 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68   }..  /* Sync th
1d1e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1d1f0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
1d200 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
1d210 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1d220 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63  ){.    rc = sync
1d230 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1d240 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d250 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1d260 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20  ->fullSync && . 
1d270 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a       !(pPager->j
1d280 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1d290 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
1d2a0 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 21  MORY) &&.      !
1d2b0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
1d2c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1d2d0 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
1d2e0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1d2f0 50 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20 20 20  PEND).    ){.   
1d300 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
1d310 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1d320 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1d330 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1d340 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1d350 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1d360 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67  his page is larg
1d370 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1d380 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  ent size of.  **
1d390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d3a0 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
1d3b0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
1d3c0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1d3d0 6c 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  l..  ** This is 
1d3e0 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
1d3f0 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
1d400 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
1d410 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61   will not.  ** a
1d420 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61  ctually write da
1d430 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69  ta to the file i
1d440 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
1d450 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20  *.  ** Consider 
1d460 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
1d470 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73  quence of events
1d480 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45  :.  **.  **   BE
1d490 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a  GIN;.  **     <j
1d4a0 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20  ournal page X>. 
1d4b0 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
1d4c0 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20  page X>.  **    
1d4d0 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
1d4e0 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e   **       <shrin
1d4f0 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
1d500 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 2a 2a  to Y pages>.  **
1d510 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
1d520 73 73 28 70 61 67 65 20 58 29 0a 20 20 2a 2a 20  ss(page X).  ** 
1d530 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
1d540 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  sp;.  **.  ** If
1d550 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
1d560 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
1d570 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
1d580 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
1d590 65 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74  en.  ** out to t
1d5a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d5b0 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72  , but will be dr
1d5c0 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  opped from the c
1d5d0 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a  ache. Then,.  **
1d5e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
1d5f0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
1d600 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
1d610 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
1d620 65 61 64 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ead.  ** data fr
1d630 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1d640 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
1d650 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
1d660 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 2a 2a  age X as it.  **
1d670 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72   was when the tr
1d680 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1d690 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73  d, not as it was
1d6a0 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54   when "SAVEPOINT
1d6b0 20 73 70 22 0a 20 20 2a 2a 20 77 61 73 20 65 78   sp".  ** was ex
1d6c0 65 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  ecuted..  **.  *
1d6d0 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
1d6e0 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  s to write the c
1d6f0 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20  urrent data for 
1d700 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20  page X into the 
1d710 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  .  ** sub-journa
1d720 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
1d730 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1d740 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
1d750 20 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65   it will.  ** be
1d760 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1d770 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77   current value w
1d780 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
1d790 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 2a  K TO sp" is .  *
1d7a0 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f  * executed..  */
1d7b0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20  .  if( NEVER(.  
1d7c0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
1d7d0 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
1d7e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
1d7f0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1d800 65 28 70 50 67 29 0a 20 20 29 20 29 7b 0a 20 20  e(pPg).  ) ){.  
1d810 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
1d820 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lPage(pPg);.  }.
1d830 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
1d840 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1d850 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
1d860 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
1d870 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1d880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 67  TE_OK ){.    pPg
1d890 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
1d8a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1d8b0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
1d8c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  ;.  }..  /* Mark
1d8d0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
1d8e0 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
1d8f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d900 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1d910 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
1d920 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1d930 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1d940 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
1d950 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
1d960 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
1d970 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1d980 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f  ager, rc);.}.../
1d990 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
1d9a0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
1d9b0 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
1d9c0 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
1d9d0 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
1d9e0 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
1d9f0 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
1da00 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
1da10 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
1da20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
1da30 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
1da40 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
1da50 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
1da60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1da70 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
1da80 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
1da90 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
1daa0 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
1dab0 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
1dac0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
1dad0 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
1dae0 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
1daf0 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
1db00 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
1db10 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
1db20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
1db30 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
1db40 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
1db50 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
1db60 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
1db70 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
1db80 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
1db90 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
1dba0 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1dbb0 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
1dbc0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
1dbd0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
1dbe0 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
1dbf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1dc00 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
1dc10 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
1dc20 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
1dc30 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
1dc40 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
1dc50 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
1dc60 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
1dc70 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
1dc80 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ) API..**.** The
1dc90 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
1dca0 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
1dcb0 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68  fy properties th
1dcc0 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a  at affect the.**
1dcd0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
1dce0 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75  e pager. It shou
1dcf0 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d  ld be passed som
1dd00 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e  e bitwise combin
1dd10 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ation.** of the 
1dd20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
1dd30 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f  AL and PAGER_NO_
1dd40 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a  READLOCK flags..
1dd50 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
1dd60 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
1dd70 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
1dd80 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
1dd90 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
1dda0 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
1ddb0 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
1ddc0 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
1ddd0 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
1dde0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
1ddf0 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
1de00 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
1de10 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
1de20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
1de30 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1de40 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
1de50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
1de60 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
1de70 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
1de80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1de90 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
1dea0 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
1deb0 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
1dec0 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
1ded0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
1dee0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
1def0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
1df00 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
1df10 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
1df20 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
1df30 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
1df40 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
1df50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df60 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
1df70 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1df80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1df90 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
1dfa0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
1dfb0 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
1dfc0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
1dfd0 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
1dfe0 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
1dff0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e000 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
1e010 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1e020 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
1e030 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1e040 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1e050 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
1e060 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
1e070 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
1e080 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
1e090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
1e0a0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
1e0b0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
1e0c0 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
1e0d0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
1e0e0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
1e0f0 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
1e100 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
1e110 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
1e120 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
1e130 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
1e140 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
1e150 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
1e160 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
1e170 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
1e180 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
1e190 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
1e1a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e1b0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
1e1c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1e1d0 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
1e1e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1e1f0 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
1e200 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
1e210 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
1e220 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
1e230 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1e240 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1e250 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
1e260 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
1e270 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e280 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
1e290 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
1e2a0 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
1e2b0 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
1e2c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
1e2d0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
1e2e0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
1e2f0 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
1e300 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
1e310 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1e320 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
1e330 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
1e340 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1e350 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
1e360 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
1e370 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
1e380 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
1e390 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
1e3a0 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
1e3b0 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
1e3c0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
1e3d0 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20  O_READLOCK)!=0; 
1e3e0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
1e3f0 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
1e400 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
1e410 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
1e420 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
1e430 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
1e440 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
1e450 20 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20   u16 szPageDflt 
1e460 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1e470 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
1e480 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
1e490 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  e */..  /* Figur
1e4a0 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  e out how much s
1e4b0 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
1e4c0 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
1e4d0 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20  l file-handle.  
1e4e0 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77  ** (there are tw
1e4f0 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d  o of them, the m
1e500 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
1e510 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29  the sub-journal)
1e520 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74  . This.  ** is t
1e530 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
1e540 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
1e550 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
1e560 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a  al file handle .
1e570 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c    ** and a regul
1e580 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ar journal file-
1e590 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61  handle. Note tha
1e5a0 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75  t a "regular jou
1e5b0 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a  rnal-handle".  *
1e5c0 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70  * may be a wrapp
1e5d0 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61  er capable of ca
1e5e0 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ching the first 
1e5f0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  portion of the j
1e600 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
1e610 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d   in memory to im
1e620 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d  plement the atom
1e630 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
1e640 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a  ation (see .  **
1e650 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75   source file jou
1e660 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20  rnal.c)..  */.  
1e670 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
1e680 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c  alSize(pVfs)>sql
1e690 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
1e6a0 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72  ze() ){.    jour
1e6b0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
1e6c0 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72  UND8(sqlite3Jour
1e6d0 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a  nalSize(pVfs));.
1e6e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
1e6f0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
1e700 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d  OUND8(sqlite3Mem
1e710 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a  JournalSize());.
1e720 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
1e730 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
1e740 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
1e750 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
1e760 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
1e770 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
1e780 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
1e790 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
1e7a0 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
1e7b0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
1e7c0 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
1e7d0 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
1e7e0 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
1e7f0 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
1e800 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
1e810 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
1e820 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
1e830 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
1e840 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
1e850 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
1e860 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  {.    nPathname 
1e870 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
1e880 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
1e890 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
1e8a0 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
1e8b0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
1e8c0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1e8d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e8e0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  MEM;.    }.#ifnd
1e8f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
1e900 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
1e910 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
1e920 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
1e930 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
1e940 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
1e950 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
1e960 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1e970 20 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61   {.      zPathna
1e980 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
1e990 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
1e9a0 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
1e9b0 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
1e9c0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1e9d0 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
1e9e0 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
1e9f0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
1ea00 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
1ea10 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   }..    nPathnam
1ea20 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
1ea30 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
1ea40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ea50 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
1ea60 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
1ea70 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
1ea80 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
1ea90 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
1eaa0 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
1eab0 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
1eac0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
1ead0 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
1eae0 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
1eaf0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
1eb00 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
1eb10 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
1eb20 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1eb30 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
1eb40 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
1eb50 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
1eb60 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
1eb70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1eb80 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
1eb90 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
1eba0 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
1ebb0 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
1ebc0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
1ebd0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1ebe0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
1ebf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ec00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1ec10 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
1ec20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ec30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1ec40 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
1ec50 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
1ec60 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
1ec70 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
1ec80 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
1ec90 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
1eca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
1ecb0 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
1ecc0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
1ecd0 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
1ece0 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
1ecf0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1ed00 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
1ed10 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1ed20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
1ed30 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
1ed40 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
1ed50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1ed60 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
1ed70 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
1ed80 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
1ed90 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
1eda0 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
1edb0 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
1edc0 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
1edd0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1ede0 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
1edf0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1ee00 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
1ee10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1ee20 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
1ee30 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
1ee40 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
1ee50 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
1ee60 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
1ee70 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
1ee80 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
1ee90 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
1eea0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
1eeb0 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
1eec0 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
1eed0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1eee0 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
1eef0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
1ef00 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
1ef10 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1ef20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
1ef30 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
1ef40 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
1ef50 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
1ef60 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
1ef70 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
1ef80 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
1ef90 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1efa0 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
1efb0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
1efc0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
1efd0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
1efe0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
1eff0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
1f000 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
1f010 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 8 + 1         
1f020 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
1f030 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72   */.  );.  asser
1f040 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1f050 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
1f060 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
1f070 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
1f080 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
1f090 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f0a0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
1f0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1f0c0 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
1f0d0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
1f0e0 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
1f0f0 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
1f100 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
1f110 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f120 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
1f130 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
1f140 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
1f150 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
1f160 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
1f170 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
1f180 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
1f190 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f1a0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
1f1b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
1f1c0 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
1f1d0 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
1f1e0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
1f1f0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f200 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
1f210 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
1f220 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
1f230 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1f240 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
1f250 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
1f260 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
1f270 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
1f280 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
1f290 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
1f2a0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
1f2b0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61  hname ){.    pPa
1f2c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
1f2d0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
1f2e0 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29  = nPathname + 1)
1f2f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
1f300 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1f310 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
1f320 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
1f330 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
1f340 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
1f350 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
1f360 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
1f370 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
1f380 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
1f390 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  8);.    if( pPag
1f3a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
1f3b0 3d 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a  ==0 ) pPager->zJ
1f3c0 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20  ournal[0] = 0;. 
1f3d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f3e0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
1f3f0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
1f400 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
1f410 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
1f420 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
1f430 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1f440 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
1f450 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
1f460 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20  me[0] && !memDb 
1f470 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
1f480 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f490 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
1f4a0 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
1f4b0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
1f4c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1f4d0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
1f4e0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
1f4f0 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
1f500 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65  , &fout);.    re
1f510 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
1f520 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1f530 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
1f540 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
1f550 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
1f560 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
1f570 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
1f580 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
1f590 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
1f5a0 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
1f5b0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
1f5c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1f5d0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
1f5e0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
1f5f0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
1f600 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
1f610 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
1f620 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
1f630 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
1f640 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1f650 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1f660 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
1f670 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
1f680 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
1f690 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
1f6a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
1f6b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1f6c0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
1f6d0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1f6e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
1f6f0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
1f700 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
1f710 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f720 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
1f730 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
1f740 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
1f750 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
1f760 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
1f770 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
1f780 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1f790 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
1f7a0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
1f7b0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f7c0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
1f7d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f7e0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1f7f0 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  t = (u16)pPager-
1f800 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
1f810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1f820 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1f830 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
1f840 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1f850 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1f860 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1f870 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1f880 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
1f890 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
1f8a0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
1f8b0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
1f8c0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
1f8d0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
1f8e0 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
1f8f0 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
1f900 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1f910 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f920 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
1f930 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
1f940 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
1f950 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
1f960 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
1f970 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
1f980 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
1f990 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
1f9a0 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
1f9b0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
1f9c0 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
1f9d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1f9e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1f9f0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1fa00 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
1fa10 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
1fa20 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
1fa30 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
1fa40 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
1fa50 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
1fa60 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
1fa70 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
1fa80 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
1fa90 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
1faa0 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
1fab0 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
1fac0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
1fad0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
1fae0 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
1faf0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1fb00 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
1fb10 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
1fb20 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
1fb30 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
1fb40 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
1fb50 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
1fb60 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
1fb70 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
1fb80 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
1fb90 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
1fba0 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
1fbb0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1fbc0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
1fbd0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
1fbe0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
1fbf0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
1fc00 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1fc10 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
1fc20 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
1fc30 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
1fc40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
1fc50 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
1fc60 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
1fc70 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
1fc80 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
1fc90 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1fca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1fcb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
1fcc0 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
1fcd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1fce0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
1fcf0 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
1fd00 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
1fd10 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1fd20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
1fd30 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
1fd40 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
1fd50 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
1fd60 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
1fd70 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1fd80 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
1fd90 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1fda0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fdb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
1fdc0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
1fdd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
1fde0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
1fdf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1fe00 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
1fe10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1fe20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1fe30 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
1fe40 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
1fe50 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
1fe60 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
1fe70 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
1fe80 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
1fe90 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
1fea0 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
1fec0 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
1fed0 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
1fee0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
1fef0 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
1ff00 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
1ff10 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
1ff20 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
1ff30 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1ff40 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
1ff50 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
1ff60 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1ff70 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
1ff80 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1ff90 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
1ffa0 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  al;.  pPager->no
1ffb0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65  Readlock = (noRe
1ffc0 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
1ffd0 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70  ly) ?1:0;.  /* p
1ffe0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1fff0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20000 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
20010 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20020 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
20030 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
20040 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d  eValid = (u8)mem
20050 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  Db;.  /* pPager-
20060 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
20070 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
20080 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
20090 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
200a0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
200b0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
200c0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
200d0 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
200e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
200f0 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
20100 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
20110 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
20120 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
20130 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
20140 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
20150 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
20160 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
20170 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
20180 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
20190 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
201a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
201b0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
201c0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
201d0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
201e0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
201f0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
20200 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
20210 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
20220 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
20230 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
20240 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20250 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20260 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
20270 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
20280 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
20290 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
202a0 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  u8)readOnly;.  /
202b0 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
202c0 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73  nc = 0; */.  ass
202d0 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
202e0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
202f0 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
20300 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
20310 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
20320 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
20330 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
20340 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
20350 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
20360 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
20370 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
20380 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
20390 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
203a0 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
203b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
203c0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
203d0 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
203e0 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
203f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
20400 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
20410 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
20420 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
20430 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20440 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
20450 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
20460 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
20470 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
20480 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
20490 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
204a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
204b0 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
204c0 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
204d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
204e0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
204f0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
20500 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
20510 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
20520 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20530 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
20540 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
20550 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
20560 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d  Reinit;.  /* mem
20570 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
20580 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
20590 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
205a0 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ..  *ppPager = p
205b0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
205c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
205d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
205e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
205f0 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
20600 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
20610 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
20620 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
20630 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
20640 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
20650 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
20660 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
20670 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
20680 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
20690 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
206a0 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
206b0 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
206c0 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
206d0 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
206e0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
206f0 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
20700 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
20710 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
20720 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
20730 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
20740 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
20750 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
20760 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
20770 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
20780 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20790 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
207a0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
207b0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
207c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
207d0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
207e0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
207f0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
20800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
20810 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
20820 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
20830 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
20840 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20850 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
20860 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
20870 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
20880 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
20890 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
208a0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
208b0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
208c0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
208d0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
208e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
208f0 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
20900 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
20910 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
20920 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
20930 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
20940 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20950 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
20960 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
20970 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
20980 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
20990 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
209a0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
209b0 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
209c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
209d0 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
209e0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
209f0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
20a00 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
20a10 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
20a20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
20a30 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
20a40 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
20a50 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
20a60 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
20a70 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
20a80 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
20a90 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
20aa0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
20ab0 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
20ac0 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
20ad0 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
20ae0 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
20af0 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
20b00 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
20b10 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
20b20 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
20b30 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
20b40 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
20b50 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
20b60 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
20b70 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
20b80 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
20b90 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
20ba0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20bb0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20bc0 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
20bd0 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
20be0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
20bf0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
20c00 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
20c10 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20c20 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
20c30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20c40 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
20c50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
20c60 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
20c70 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
20c80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
20c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20ca0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
20cb0 74 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20  t exists;       
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20cd0 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
20ce0 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
20cf0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
20d00 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
20d10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
20d20 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
20d30 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
20d40 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
20d50 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
20d60 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
20d70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20d80 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
20d90 48 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78  HARED );..  *pEx
20da0 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
20db0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20dc0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
20dd0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
20de0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
20df0 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
20e00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20e10 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
20e20 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
20e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20e40 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
20e50 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
20e60 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
20e70 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
20e80 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
20e90 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
20ea0 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
20eb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
20ec0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
20ed0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
20ee0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
20ef0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
20f00 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
20f10 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
20f20 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
20f30 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
20f40 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
20f50 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
20f60 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
20f70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20f80 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
20f90 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
20fa0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
20fb0 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
20fc0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
20fd0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
20fe0 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
20ff0 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
21000 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
21010 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
21020 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
21030 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
21040 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
21050 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
21060 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
21070 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
21080 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
21090 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
210a0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
210b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
210c0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
210d0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
210e0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
210f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
21100 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
21110 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
21120 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
21130 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
21140 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
21150 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
21160 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
21170 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
21180 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
21190 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
211a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
211b0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
211c0 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
211d0 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
211e0 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
211f0 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
21200 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
21210 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
21220 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
21230 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
21240 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
21250 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21260 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21270 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
21280 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
21290 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
212a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
212b0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
212c0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
212d0 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
212e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
212f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
21300 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
21310 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
21320 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21330 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
21340 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
21350 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
21360 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21370 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
21380 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
21390 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
213a0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
213b0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
213c0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
213d0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
213e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
213f0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
21400 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21410 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
21420 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
21430 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
21440 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
21450 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
21460 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
21470 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
21480 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
21490 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
214a0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
214b0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
214c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
214d0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
214e0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
214f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
21500 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21510 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
21520 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
21530 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
21540 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
21550 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
21560 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
21570 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
21580 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
215a0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
215b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
215c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
215d0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
215e0 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
215f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21600 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21610 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
21620 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
21630 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21640 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
21650 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21660 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
21670 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
21680 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
21690 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
216a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
216b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
216c0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
216d0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
216e0 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
216f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
21700 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
21710 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
21720 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a    ** its has a z
21730 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
21740 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
21750 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
21760 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
21770 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
21780 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
21790 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
217a0 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
217b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
217c0 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
217d0 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
217e0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
217f0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
21800 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
21810 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
21820 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
21830 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
21840 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
21850 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
21860 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
21870 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
21880 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
21890 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
218a0 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
218b0 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
218c0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
218d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
218e0 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
218f0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
21900 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
21910 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
21920 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
21930 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21940 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
21950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
21960 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21970 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
21980 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
21990 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
219a0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
219b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
219c0 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
219d0 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
219e0 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
219f0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
21a00 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
21a10 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
21a20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21a30 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
21a40 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
21a50 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
21a60 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
21a70 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
21a80 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
21a90 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21aa0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
21ab0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
21ac0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
21ad0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
21ae0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
21af0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
21b00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21b10 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
21b20 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
21b30 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
21b40 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
21b50 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
21b60 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
21b70 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
21b80 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
21b90 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
21ba0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
21bb0 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
21bc0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21bf0 2f 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  /.  i64 iOffset;
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c10 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
21c20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20  of file to read 
21c30 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  from */..  asser
21c40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21c50 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 26  >=PAGER_SHARED &
21c60 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
21c70 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
21c80 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
21c90 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e  f( NEVER(!isOpen
21ca0 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
21cb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21cc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
21cd0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d  .    memset(pPg-
21ce0 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
21cf0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
21d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21d10 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65  OK;.  }.  iOffse
21d20 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
21d30 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
21d40 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
21d50 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
21d60 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
21d70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21d80 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  e, iOffset);.  i
21d90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
21da0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
21db0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21dc0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
21dd0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
21de0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
21df0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
21e00 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
21e10 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
21e20 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
21e30 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
21e40 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
21e50 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
21e60 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
21e70 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
21e80 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
21e90 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
21ea0 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
21eb0 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
21ec0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
21ed0 6f 2e 20 20 42 79 74 65 73 20 33 32 2e 2e 33 35  o.  Bytes 32..35
21ee0 20 61 6e 64 20 33 35 2e 2e 33 39 20 73 68 6f 75   and 35..39 shou
21ef0 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
21f00 72 73 20 77 68 69 63 68 20 61 72 65 0a 20 20 20  rs which are.   
21f10 20 20 20 2a 2a 20 6e 65 76 65 72 20 30 78 66 66     ** never 0xff
21f20 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
21f30 69 6e 67 20 70 50 61 67 65 72 2d 3e 64 62 46 69  ing pPager->dbFi
21f40 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
21f50 6c 20 30 78 66 66 0a 20 20 20 20 20 20 2a 2a 20  l 0xff.      ** 
21f60 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
21f70 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
21f80 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
21f90 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
21fa0 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
21fb0 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
21fc0 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
21fd0 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
21fe0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
21ff0 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
22000 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
22010 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
22020 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
22030 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
22040 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
22050 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
22060 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
22070 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
22080 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
22090 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
220a0 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
220b0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
220c0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
220d0 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
220e0 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
220f0 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
22100 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
22110 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
22120 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
22130 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
22140 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
22150 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
22160 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
22170 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
22180 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
22190 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
221a0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
221b0 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
221c0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
221d0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
221e0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
221f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
22200 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
22210 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
22220 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
22230 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22240 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
22250 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
22260 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
22270 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22280 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22290 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
222a0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
222b0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
222c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
222d0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
222e0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
222f0 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69  erAcquire() unti
22300 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
22310 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
22320 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
22330 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
22340 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
22350 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
22360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
22370 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
22380 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
22390 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
223a0 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
223b0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
223c0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
223d0 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
223e0 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
223f0 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
22400 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
22410 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
22420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22430 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
22440 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
22450 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
22460 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
22470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22480 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
22490 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
224a0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
224b0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
224c0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
224d0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
224e0 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
224f0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
22500 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
22510 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
22520 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
22530 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
22540 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
22550 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
22560 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
22570 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
22580 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
22590 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
225a0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
225b0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
225c0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
225d0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
225e0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
225f0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
22600 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
22610 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
22620 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
22630 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
22640 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
22650 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
22660 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
22670 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
22680 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
22690 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
226a0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
226b0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
226c0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
226d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
226e0 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
226f0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
22700 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
22710 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
22720 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
22730 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
22740 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  (2) above is not
22750 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20   attempted, and 
22760 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20  if the.** pager 
22770 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
22780 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
22790 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e  SQLITE_FULL when
227a0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
227b0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74  .** the error st
227c0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
227d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69  s returned. It i
227e0 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72  s permitted to r
227f0 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ead the.** datab
22800 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49  ase when in SQLI
22810 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74  TE_FULL error st
22820 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ate..**.** Other
22830 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
22840 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
22850 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
22860 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a  returned. If an.
22870 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  ** IO error occu
22880 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
22890 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
228a0 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
228b0 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
228c0 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  e or rolling bac
228d0 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
228e0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
228f0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
22900 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22910 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
22920 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22930 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22940 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
22950 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22960 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72  de */.  int isEr
22970 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20  rorReset = 0;   
22980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
22990 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67  ue if recovering
229a0 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74   from error stat
229b0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
229c0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
229d0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
229e0 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
229f0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
22a00 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
22a10 61 67 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ages */.  assert
22a20 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
22a30 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
22a40 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
22a50 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42   if( NEVER(MEMDB
22a60 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
22a70 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70  ode) ){ return p
22a80 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20  Pager->errCode; 
22a90 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
22aa0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 61  database is in a
22ab0 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e  n error-state, n
22ac0 6f 77 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  ow is a chance t
22ad0 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
22ae0 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
22af0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
22b00 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
22b10 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  and rollback.  *
22b20 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61  * any hot journa
22b30 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
22b40 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  stem..  */.  if(
22b50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
22b60 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   ){.    if( isOp
22b70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
22b80 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  || pPager->zJour
22b90 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45  nal ){.      isE
22ba0 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
22bb0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
22bc0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
22bd0 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
22be0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
22bf0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
22c00 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
22c10 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72  NLOCK || isError
22c20 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c  Reset ){.    sql
22c30 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
22c40 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
22c50 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73  pVfs;.    int is
22c60 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  HotJournal = 0;.
22c70 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
22c80 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
22c90 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
22ca0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
22cb0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
22cc0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
22cd0 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
22ce0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22cf0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  r->readOnly );. 
22d00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
22d10 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
22d20 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
22d30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
22d40 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
22d50 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
22d60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
22d70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22d80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
22d90 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
22da0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
22db0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
22dc0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
22dd0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
22de0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
22df0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
22e00 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20  RED_LOCK );..   
22e10 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
22e20 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
22e30 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
22e40 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
22e50 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
22e60 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
22e70 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
22e80 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
22e90 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
22ea0 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45 72  */.    if( !isEr
22eb0 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
22ec0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22ed0 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52  ->state <= PAGER
22ee0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 20  _SHARED );.     
22ef0 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
22f00 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48  nal(pPager, &isH
22f10 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
22f20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22f30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
22f40 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
22f50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
22f60 28 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c  ( isErrorReset |
22f70 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  | isHotJournal )
22f80 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  {.      /* Get a
22f90 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
22fa0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22fb0 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
22fc0 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
22fd0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
22fe0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
22ff0 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
23000 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
23010 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
23020 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
23030 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
23040 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
23050 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
23060 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
23070 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
23080 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
23090 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
230a0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
230b0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
230c0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
230d0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
230e0 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
230f0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
23100 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
23110 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
23120 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
23130 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
23140 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
23150 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
23160 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
23170 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
23180 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
23190 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
231a0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
231b0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
231c0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
231d0 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
231e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
231f0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
23200 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
23210 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
23220 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43  Pager->state<EXC
23230 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
23240 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23250 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
23260 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
23270 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
23280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
232a0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
232b0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
232c0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
232d0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
232e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
232f0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
23300 53 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  SIVE;.      }. .
23310 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
23320 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
23330 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
23340 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
23350 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78   in .      ** ex
23360 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
23370 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
23380 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
23390 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
233a0 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20      ** possibly 
233b0 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
233c0 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
233d0 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
233e0 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  , the.      ** O
233f0 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
23400 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
23410 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
23420 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
23430 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69     ** a read/wri
23440 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  te file handle..
23450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
23460 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
23470 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
23480 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
23490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
234a0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50  OsAccess(pVfs,pP
234b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53  ager->zJournal,S
234c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
234d0 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20  STS,&res);.     
234e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
234f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23500 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
23510 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
23520 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
23530 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
23540 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
23550 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
23560 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
23570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
23580 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
23590 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
235a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
235b0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
235c0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
235d0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
235e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
235f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
23600 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
23610 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
23620 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
23630 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23640 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
23650 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
23660 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
23670 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
23680 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
23690 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
236a0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
236b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
236c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
236d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
236e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
236f0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
23700 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
23710 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
23720 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
23730 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
23740 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
23750 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
23760 6f 72 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ore .           
23770 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
23780 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
23790 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
237a0 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
237b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61             ** ma
237c0 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
237d0 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
237e0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
237f0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
23800 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
23810 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
23820 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
23830 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  oes not exist.  
23840 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
23850 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
23860 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
23870 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23880 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
23890 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
238a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
238b0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
238c0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
238d0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 79 20     /* TODO: Why 
238e0 61 72 65 20 74 68 65 73 65 20 63 6c 65 61 72 65  are these cleare
238f0 64 20 68 65 72 65 3f 20 49 73 20 69 74 20 6e 65  d here? Is it ne
23900 63 65 73 73 61 72 79 3f 20 2a 2f 0a 20 20 20 20  cessary? */.    
23910 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
23920 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
23930 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
23940 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
23950 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
23960 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
23970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
23980 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f  r = 0;. .      /
23990 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
239a0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
239b0 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
239c0 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
239d0 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
239e0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
239f0 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
23a00 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
23a10 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
23a20 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
23a30 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
23a40 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
23a50 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
23a60 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
23a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23a80 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
23a90 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
23aa0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
23ab0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
23ac0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23ad0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23ae0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
23af0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
23b00 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
23b10 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
23b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23b30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
23b40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
23b50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
23b60 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
23b70 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
23b80 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
23b90 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
23ba0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
23bb0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23bc0 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69  >pBackup || sqli
23bd0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
23be0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
23bf0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  he)>0 ){.      /
23c00 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
23c10 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
23c20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
23c30 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
23c40 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
23c50 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
23c60 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
23c70 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
23c80 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
23c90 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
23ca0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
23cb0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
23cc0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
23cd0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
23ce0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
23cf0 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
23d00 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
23d10 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
23d20 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
23d30 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
23d40 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
23d50 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
23d60 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
23d70 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
23d80 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
23d90 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
23da0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
23db0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
23dc0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
23dd0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
23de0 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
23df0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
23e00 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
23e10 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
23e20 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
23e30 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
23e40 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
23e50 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
23e60 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
23e70 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
23e80 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
23e90 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
23ea0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
23eb0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
23ec0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
23ed0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
23ee0 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
23ef0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
23f00 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
23f10 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
23f20 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
23f30 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
23f40 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
23f50 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
23f60 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20  (pPager, 0);..  
23f70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23f80 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
23f90 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
23fa0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
23fb0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
23fc0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
23fd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
23fe0 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  izeValid );.    
23ff0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
24000 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
24010 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
24020 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
24030 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
24040 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
24050 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24060 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
24070 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
24080 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
24090 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
240a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
240b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
240c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
240d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
240e0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
240f0 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
24100 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
24110 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
24120 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
24130 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
24140 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
24150 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
24160 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
24170 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
24180 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
24190 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
241a0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
241b0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
241c0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
241d0 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66  HARED );.  }.. f
241e0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
241f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24200 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    /* pager_unloc
24210 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
24220 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  or exclusive mod
24230 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  e and in-memory 
24240 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
24250 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
24260 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
24270 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24280 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
24290 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
242a0 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
242b0 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
242c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
242d0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
242e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
242f0 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
24300 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
24310 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
24320 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
24330 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
24340 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
24350 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
24360 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
24370 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
24380 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
24390 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
243a0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
243b0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
243c0 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
243d0 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
243e0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
243f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24400 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67  =0).   && (!pPag
24410 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
24420 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
24430 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b  rnalOff>0) .  ){
24440 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
24450 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
24460 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
24470 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
24480 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
24490 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
244a0 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
244b0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
244c0 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
244d0 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
244e0 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
244f0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
24500 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
24510 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
24520 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
24530 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24540 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
24550 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
24560 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
24570 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
24580 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
24590 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
245a0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
245b0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
245c0 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
245d0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
245e0 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
245f0 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
24600 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
24610 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
24620 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
24630 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
24640 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
24650 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
24660 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
24670 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
24680 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
24690 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
246a0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
246b0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
246c0 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
246d0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
246e0 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
246f0 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
24700 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
24710 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
24720 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
24730 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24740 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
24750 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
24760 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
24770 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
24780 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
24790 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
247a0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
247b0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
247c0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
247d0 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
247e0 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
247f0 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
24800 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
24810 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
24820 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
24830 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
24840 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
24850 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
24860 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
24870 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
24880 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
24890 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
248a0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
248b0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
248c0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
248d0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
248e0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
248f0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
24900 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
24910 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
24920 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65  occurs in two se
24930 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73  perate scenarios
24940 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
24950 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
24960 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
24970 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24980 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
24990 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
249a0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
249b0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
249c0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
249d0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
249e0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
249f0 20 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74   populate with t
24a00 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
24a10 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
24a20 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
24a30 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
24a40 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
24a50 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
24a60 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
24a70 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
24a80 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
24a90 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
24aa0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
24ab0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
24ac0 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
24ad0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
24ae0 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
24af0 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
24b00 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
24b10 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
24b20 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
24b30 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
24b40 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
24b50 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
24b60 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
24b70 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
24b80 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
24b90 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
24ba0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
24bb0 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
24bc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24bd0 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
24be0 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
24bf0 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
24c00 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
24c10 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
24c20 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
24c30 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
24c40 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
24c50 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
24c60 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
24c70 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
24c80 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
24c90 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
24ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
24cb0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
24cc0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
24cd0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
24ce0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
24cf0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
24d00 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
24d10 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
24d20 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
24d30 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
24d40 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
24d50 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
24d60 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
24d70 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
24d80 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
24d90 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
24da0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
24db0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
24dc0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
24dd0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
24de0 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
24df0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
24e00 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
24e10 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
24e20 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
24e30 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
24e40 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
24e50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
24e60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24e70 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
24e80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
24e90 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
24ea0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
24eb0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
24ec0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
24ed0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
24ee0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
24ef0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
24f00 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
24f10 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
24f20 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
24f30 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
24f40 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
24f50 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
24f60 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
24f70 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
24f80 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
24f90 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
24fa0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
24fb0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
24fc0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
24fd0 65 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  e>PAGER_UNLOCK )
24fe0 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
24ff0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25000 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25010 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
25020 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
25030 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
25040 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
25050 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
25060 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
25070 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
25080 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
25090 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
250a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
250b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
250c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
250d0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
250e0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
250f0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
25100 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
25110 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
25120 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
25130 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
25140 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
25150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25160 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
25170 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
25180 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
25190 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
251a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
251b0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
251c0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
251d0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
251e0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
251f0 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
25200 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
25210 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
25220 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
25230 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
25240 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
25250 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
25260 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
25270 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
25280 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
25290 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
252a0 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
252b0 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
252c0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
252d0 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  er ){.    /* In 
252e0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
252f0 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
25300 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
25310 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
25320 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
25330 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
25340 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
25350 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
25360 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
25370 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
25380 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
25390 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
253a0 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
253b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
253c0 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
253d0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
253e0 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
253f0 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
25400 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
25410 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
25420 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20  itialized.  */. 
25430 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20     int nMax;..  
25440 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
25450 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
25460 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a   pPg = *ppPage;.
25470 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
25480 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
25490 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
254a0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
254b0 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
254c0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
254d0 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
254e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
254f0 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
25500 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
25510 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
25520 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
25530 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
25540 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
25550 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
25560 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25570 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25580 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
25590 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
255a0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   }..    rc = sql
255b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
255c0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78  nt(pPager, &nMax
255d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
255e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
255f0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
25600 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
25610 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
25620 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  | nMax<(int)pgno
25630 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
25640 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
25650 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
25660 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
25670 78 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d 20 53  xPgno ){..rc = S
25680 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67 6f 74  QLITE_FULL;..got
25690 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
256a0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
256b0 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
256c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
256d0 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
256e0 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
256f0 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
25700 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
25710 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
25720 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
25730 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
25740 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
25750 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
25760 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
25770 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
25780 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
25790 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
257a0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
257b0 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
257c0 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
257d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
257e0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
257f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
25800 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
25810 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
25820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
25830 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
25840 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25850 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
25860 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
25870 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
25880 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
25890 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
258a0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
258b0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
258c0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
258d0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
258e0 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
258f0 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
25900 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
25910 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
25920 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
25930 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
25940 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
25950 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
25960 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
25970 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
25980 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
25990 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
259a0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
259b0 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
259c0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
259d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
259e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
259f0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
25a00 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
25a10 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
25a20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25a30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
25a40 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
25a50 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
25a60 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
25a70 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
25a80 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
25a90 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
25aa0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
25ab0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
25ac0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
25ad0 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
25ae0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
25af0 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
25b00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
25b10 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
25b20 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
25b30 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
25b40 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
25b50 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
25b60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
25b70 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
25b80 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
25b90 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
25ba0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
25bb0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
25bc0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
25bd0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
25be0 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
25bf0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
25c00 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
25c10 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
25c20 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
25c30 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
25c40 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
25c50 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
25c60 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
25c70 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
25c80 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
25c90 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
25ca0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
25cb0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
25cc0 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
25cd0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
25ce0 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
25cf0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
25d00 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
25d10 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
25d20 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
25d30 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
25d40 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
25d50 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
25d60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
25d70 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
25d80 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
25d90 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
25da0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
25db0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
25dc0 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
25dd0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
25de0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
25df0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
25e00 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
25e10 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
25e20 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
25e30 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
25e40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25e50 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
25e60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25e70 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55  >state > PAGER_U
25e80 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  NLOCK );.  sqlit
25e90 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
25ea0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
25eb0 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
25ec0 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
25ed0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
25ee0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
25ef0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
25f00 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
25f10 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
25f20 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
25f30 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
25f40 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
25f50 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
25f60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
25f70 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
25f80 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
25f90 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
25fa0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
25fb0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
25fc0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
25fd0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
25fe0 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
25ff0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
26000 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
26010 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
26020 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
26030 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
26040 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
26050 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
26060 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
26070 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
26080 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ile has already 
26090 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73  been opened, ens
260a0 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ure that the.** 
260b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
260c0 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66   is open too. If
260d0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
260e0 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a  l is not open,.*
260f0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
26100 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
26110 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
26120 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
26130 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
26140 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a  ding to plan. .*
26150 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  * An SQLITE_IOER
26160 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
26170 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
26180 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71  a call to .** sq
26190 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61  lite3OsOpen() fa
261a0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
261b0 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
261c0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
261d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
261e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73  ITE_OK;.  if( is
261f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26200 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
26210 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
26220 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
26230 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
26240 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
26250 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
26260 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
26270 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
26280 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
26290 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65  r->sjfd);.    }e
262a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
262b0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
262c0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a  ager, pPager->sj
262d0 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
262e0 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
262f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
26300 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
26310 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
26320 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
26330 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
26340 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26350 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
26360 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
26370 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
26380 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
26390 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
263a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
263b0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
263c0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
263d0 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
263e0 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
263f0 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
26400 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
26410 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
26420 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
26430 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
26440 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
26450 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
26460 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26470 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
26480 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
26490 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
264a0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
264b0 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
264c0 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
264d0 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
264e0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
264f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
26500 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
26510 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
26520 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
26530 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
26540 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
26550 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
26560 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26570 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
26580 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
26590 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
265a0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
265b0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
265c0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
265d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
265e0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
265f0 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
26600 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
26610 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
26620 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
26630 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
26640 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
26650 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
26660 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
26670 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
26680 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
26690 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
266a0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
266b0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
266c0 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
266d0 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
266e0 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
266f0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
26700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26710 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
26720 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
26730 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26740 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26760 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
26770 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
26780 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
26790 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
267a0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
267b0 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
267c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
267d0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
267e0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
267f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
26800 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
26810 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
26820 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
26830 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
26840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26850 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
26860 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
26870 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
26880 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
26890 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
268a0 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
268b0 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
268c0 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
268d0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
268e0 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
268f0 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
26900 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
26910 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
26920 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
26930 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
26940 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a  ode;..  /* TODO:
26950 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f   Is it really po
26960 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65  ssible to get he
26970 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61  re with dbSizeVa
26980 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a  lid==0? If not,.
26990 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f    ** the call to
269a0 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   PagerPagecount(
269b0 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  ) can be removed
269c0 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
269d0 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
269e0 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73  eValid==0 );.  s
269f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
26a00 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
26a10 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ..  pPager->pInJ
26a20 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
26a30 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
26a40 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
26a50 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
26a60 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
26a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26a80 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
26a90 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
26aa0 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
26ab0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
26ac0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
26ad0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
26ae0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
26af0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
26b00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26b10 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
26b20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
26b30 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
26b40 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
26b50 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
26b60 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
26b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
26b80 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
26b90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
26ba0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
26bb0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
26bc0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
26bd0 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
26be0 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
26bf0 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
26c00 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
26c10 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
26c20 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20  EMP_JOURNAL):.  
26c30 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
26c40 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
26c50 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69  L).        );.#i
26c60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
26c70 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
26c80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26c90 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
26ca0 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
26cb0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
26cc0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
26cd0 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
26ce0 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
26cf0 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
26d00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
26d10 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
26d20 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
26d30 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
26d40 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
26d50 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
26d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
26d70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26d80 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ) );.  }...  /* 
26d90 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
26da0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
26db0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
26dc0 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a  le and open .  *
26dd0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
26de0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
26df0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
26e00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26e10 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
26e20 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
26e30 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
26e40 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ed. */.    pPage
26e50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
26e60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
26e70 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26e80 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
26e90 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
26ea0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
26eb0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
26ec0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26ed0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
26ee0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
26ef0 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  r = 0;.    pPage
26f00 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
26f10 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  0;.    rc = writ
26f20 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
26f30 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
26f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26f50 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
26f60 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  nt ){.    rc = o
26f70 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
26f80 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
26f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26fa0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
26fb0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
26fc0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
26fd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
26fe0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
26ff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27000 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
27010 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
27020 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
27030 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
27040 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
27050 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
27060 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
27070 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
27080 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27090 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
270a0 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
270b0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
270c0 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
270d0 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
270e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
270f0 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
27100 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
27110 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
27120 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
27130 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
27140 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
27150 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
27160 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
27170 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
27180 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
27190 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
271a0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61  in-memory file a
271b0 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nd, the journal 
271c0 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e  file is .** open
271d0 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  ed if it has not
271e0 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46   been already. F
271f0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  or a temporary f
27200 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  ile, the opening
27210 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72   .** of the jour
27220 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
27230 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
27240 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65   is an actual ne
27250 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20  ed to .** write 
27260 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
27270 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65  TODO: Why handle
27280 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
27290 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a   differently?.**
272a0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
272b0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
272c0 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61  d (or if it is a
272d0 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68  lready open), th
272e0 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  en a.** journal-
272f0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
27300 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  n to the start o
27310 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  f it..**.** If t
27320 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
27330 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
27340 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
27350 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
27360 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
27370 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
27380 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
27390 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
273a0 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
273b0 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
273c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
273d0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
273e0 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
273f0 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
27400 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
27410 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
27420 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
27430 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
27440 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
27450 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
27460 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
27470 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
27480 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
27490 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
274a0 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
274b0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
274c0 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
274d0 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
274e0 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
274f0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
27500 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
27510 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
27520 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
27530 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
27540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27550 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27560 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
27570 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67  UNLOCK );.  pPag
27580 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
27590 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
275a0 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ory;.  if( pPage
275b0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
275c0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
275d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
275e0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
275f0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
27600 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  B && !pPager->te
27610 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f  mpFile );..    /
27620 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
27630 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
27640 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
27650 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
27660 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73  ameter.    ** is
27670 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
27680 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
27690 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
276a0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
276b0 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
276c0 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
276d0 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
276e0 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
276f0 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c  CLUSIVE.    ** l
27700 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
27710 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
27720 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
27730 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
27740 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
27750 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
27760 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
27770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27780 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
27790 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
277a0 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66  SERVED;.      if
277b0 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
277c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
277d0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
277e0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
277f0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
27800 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
27810 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
27820 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75 6c   were successful
27830 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65  ly obtained, ope
27840 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
27850 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77 72    ** file and wr
27860 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
27870 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f 20  urnal-header to 
27880 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
27890 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
278a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
278b0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
278c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
278d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
278e0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
278f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
27900 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
27910 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27920 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
27930 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lOff==0 ){.    /
27940 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
27950 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61  hen the pager wa
27960 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  s in exclusive-a
27970 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c  ccess mode the l
27980 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20  ast.    ** time 
27990 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65  a (read or write
279a0 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  ) transaction wa
279b0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
279c0 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20  oncluded.    ** 
279d0 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  by this connecti
279e0 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  on. Instead of d
279f0 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  eleting the jour
27a00 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20  nal file it was 
27a10 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65  .    ** kept ope
27a20 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61 73  n and either was
27a30 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20   truncated to 0 
27a40 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65 61  bytes or its hea
27a50 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f  der was.    ** o
27a60 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
27a70 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
27a80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27a90 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  ->nRec==0 );.   
27aa0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27ab0 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
27ac0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
27ad0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27ae0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
27af0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
27b00 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
27b10 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
27b20 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
27b30 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
27b40 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r)));.  assert( 
27b50 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27b60 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
27b70 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
27b80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
27b90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
27bb0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d  rt( !pPager->dbM
27bc0 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20 2f  odified );.    /
27bd0 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20  * Ignore any IO 
27be0 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
27bf0 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65  s within pager_e
27c00 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  nd_transaction()
27c10 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75 72  . The.    ** pur
27c20 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
27c30 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74 68  l is to reset th
27c40 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
27c50 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20 20   of the pager.  
27c60 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e    ** sub-system.
27c70 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74   It doesn't matt
27c80 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  er if the journa
27c90 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 72  l-file is not pr
27ca0 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66 69  operly.    ** fi
27cb0 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73 20  nalized at this 
27cc0 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74 20  point (since it 
27cd0 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a  is not a valid j
27ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77  ournal file anyw
27cf0 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ay)..    */.    
27d00 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
27d10 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
27d20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27d30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
27d40 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
27d50 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
27d60 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
27d70 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
27d80 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
27d90 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
27da0 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
27db0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
27dc0 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
27dd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
27de0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
27df0 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
27e00 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
27e10 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
27e20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
27e30 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
27e40 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
27e50 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
27e60 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
27e70 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
27e80 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
27e90 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76  PgHdr *pPg){.  v
27ea0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
27eb0 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72  ->pData;.  Pager
27ec0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
27ed0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
27ee0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
27ef0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
27f00 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75   is not called u
27f10 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
27f20 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
27f30 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74 65  been.  ** starte
27f40 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
27f50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
27f60 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
27f70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  );..  /* If an e
27f80 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
27f90 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65  eviously detecte
27fa0 64 2c 20 77 65 20 73 68 6f 75 6c 64 20 6e 6f 74  d, we should not
27fb0 20 62 65 0a 20 20 2a 2a 20 63 61 6c 6c 69 6e 67   be.  ** calling
27fc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
27fd0 52 65 70 65 61 74 20 74 68 65 20 65 72 72 6f 72  Repeat the error
27fe0 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e   for robustness.
27ff0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
28000 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
28010 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
28020 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
28030 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
28040 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
28050 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
28060 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
28070 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
28080 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
28090 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
280a0 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
280b0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
280c0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
280d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
280e0 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  RM;..  assert( !
280f0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
28100 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  r );..  CHECK_PA
28110 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d  GE(pPg);..  /* M
28120 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
28130 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
28140 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
28150 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
28160 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
28170 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
28180 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
28190 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
281a0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
281b0 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
281c0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
281d0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
281e0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50  e(pPg) ){.    pP
281f0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
28200 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
28210 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
28220 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
28230 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
28240 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
28250 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
28260 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
28270 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
28280 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
28290 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
282a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
282b0 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
282c0 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76  tines should hav
282d0 65 20 61 6c 72 65 61 64 79 20 73 74 61 72 74 65  e already starte
282e0 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  d a transaction,
282f0 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 65  .    ** which me
28300 61 6e 73 20 74 68 65 79 20 68 61 76 65 20 61 63  ans they have ac
28310 71 75 69 72 65 64 20 74 68 65 20 6e 65 63 65 73  quired the neces
28320 73 61 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6f  sary locks and o
28330 70 65 6e 65 64 0a 20 20 20 20 2a 2a 20 61 20 72  pened.    ** a r
28340 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
28350 20 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74    Double-check t
28360 6f 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 69  o makes sure thi
28370 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
28380 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
28390 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
283a0 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67  (pPager, 0, pPag
283b0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
283c0 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
283d0 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc!=SQLITE_OK) 
283e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
283f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
28400 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
28410 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
28420 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
28430 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
28440 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61 73  _OFF ){.      as
28450 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
28460 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
28470 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
28480 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
28490 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
284a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
284b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
284c0 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
284d0 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20  fied = 1;.  .   
284e0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
284f0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
28500 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
28510 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
28520 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
28530 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
28540 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
28550 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
28560 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
28570 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
28580 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
28590 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
285a0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
285b0 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
285c0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
285d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
285e0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
285f0 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
28600 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
28610 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
28620 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68  ksum;.        ch
28630 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
28640 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
28650 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
28660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28670 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
28680 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
28690 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
286a0 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
286b0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
286c0 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a  rifies.        *
286d0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
286e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
286f0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
28700 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
28710 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
28720 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
28730 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
28740 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
28750 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
28760 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
28770 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
28780 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
28790 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  a2);.        rc 
287a0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
287b0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
287c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
287d0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
287e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
287f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28810 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
28820 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
28830 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28850 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28860 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
28870 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  4);.          pP
28880 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28890 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
288a0 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
288b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
288c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
288d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
288e0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
288f0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
28900 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
28910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
28920 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
28930 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
28940 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
28950 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
28960 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
28970 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
28990 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
289a0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
289b0 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
289c0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
289d0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
289e0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
289f0 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
28a00 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
28a10 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
28a20 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
28a30 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
28a40 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
28a50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
28a60 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
28a70 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
28a80 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
28a90 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
28aa0 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
28ab0 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
28ac0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
28ad0 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
28ae0 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
28af0 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
28b00 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
28b10 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
28b20 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
28b30 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
28b40 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
28b50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
28b60 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
28b70 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
28b80 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
28b90 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
28ba0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
28bb0 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
28bc0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
28bd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28be0 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
28bf0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
28c00 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
28c10 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
28c20 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
28c30 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
28c40 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
28c50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
28c60 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
28c70 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
28c80 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
28c90 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
28ca0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
28cb0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
28cc0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
28cd0 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  rred writing to 
28ce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28cf0 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
28d00 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
28d10 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
28d20 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
28d30 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
28d40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28d60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
28d70 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
28d80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
28d90 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
28da0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
28db0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
28dc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28dd0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
28de0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
28df0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
28e00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
28e10 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
28e20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
28e30 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
28e40 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
28e50 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
28e60 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
28e70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
28e80 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
28e90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28eb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
28ec0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
28ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
28ee0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
28ef0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
28f00 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
28f10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
28f20 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
28f30 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
28f40 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
28f50 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28f60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
28f70 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
28f80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28f90 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28fa0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
28fb0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
28fc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28fd0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
28fe0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
29000 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
29010 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
29020 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
29030 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
29040 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
29050 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
29060 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
29070 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
29080 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
29090 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
290a0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
290b0 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
290c0 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
290d0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
290e0 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
290f0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
29100 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
29110 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
29120 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
29130 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
29140 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
29150 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
29160 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20  ge(pPg) ){.     
29170 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
29180 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
29190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
291a0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
291b0 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
291c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
291d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
291e0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
291f0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
29200 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  ze<pPg->pgno ){.
29210 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
29220 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
29230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
29250 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
29260 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f  iteable. This ro
29270 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
29280 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20  lled before .** 
29290 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
292a0 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61  o a page. The ca
292b0 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20  ller must check 
292c0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
292d0 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e   .** of this fun
292e0 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72  ction and be car
292f0 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e  eful not to chan
29300 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
29310 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73   unless .** this
29320 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
29330 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
29340 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
29350 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
29360 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
29370 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
29380 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
29390 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
293a0 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
293b0 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
293c0 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
293d0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
293e0 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
293f0 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
29400 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
29410 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
29420 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
29430 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
29440 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
29450 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
29460 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  curs, SQLITE_NOM
29470 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  EM or an IO erro
29480 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29490 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72  ed.** as appropr
294a0 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  iate. Otherwise,
294b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
294c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
294d0 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
294e0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
294f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
29500 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
29510 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
29520 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
29530 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
29540 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
29550 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
29560 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
29570 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65  e);..  if( nPage
29580 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
29590 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
295a0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
295b0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
295c0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
295d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
295e0 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
295f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
29600 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
29610 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
29620 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
29630 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
29640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29650 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
29660 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
29670 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
29680 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
29690 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
296a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
296b0 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
296c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
296d0 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
296e0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
296f0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  */..    /* Set t
29700 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
29710 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
29720 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
29730 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61  t allow a journa
29740 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20  l.    ** header 
29750 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
29760 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
29770 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69  journaled by thi
29780 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
29790 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
297a0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
297b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
297c0 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
297d0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
297e0 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
297f0 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
29800 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
29810 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
29820 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
29830 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
29840 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
29850 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
29860 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
29870 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
29880 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
29890 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
298a0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
298b0 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
298c0 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
298d0 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
298e0 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73  -1)) + 1;..    s
298f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
29900 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e  ount(pPager, (in
29910 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29  t *)&nPageCount)
29920 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
29930 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
29940 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29950 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
29960 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
29970 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
29980 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
29990 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
299a0 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
299b0 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
299c0 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
299d0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
299e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
299f0 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
29a00 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
29a10 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
29a20 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
29a30 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
29a40 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
29a50 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
29a60 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
29a70 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
29a80 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
29a90 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
29aa0 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  ( pg==pPg->pgno 
29ab0 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  || !sqlite3Bitve
29ac0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
29ad0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b  nJournal, pg) ){
29ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
29af0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
29b00 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
29b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29b20 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
29b30 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
29b40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29b50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29b60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
29b70 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
29b80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29b90 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
29ba0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
29bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29bc0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
29bd0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
29be0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
29bf0 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
29c00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29c10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29c20 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
29c30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29c40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29c50 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
29c60 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
29c70 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
29c80 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
29c90 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
29ca0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  C ){.          n
29cb0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
29cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
29cd0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29ce0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
29cf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
29d00 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  f the PGHDR_NEED
29d10 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65  _SYNC flag is se
29d20 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
29d30 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
29d40 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
29d50 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
29d60 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
29d70 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
29d80 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
29d90 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
29da0 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
29db0 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
29dc0 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
29dd0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
29de0 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
29df0 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
29e00 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
29e10 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
29e20 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
29e30 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
29e40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
29e50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
29e60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29e70 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
29e80 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
29e90 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
29ea0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  nc==0 );.      f
29eb0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
29ec0 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
29ed0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
29ee0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
29ef0 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
29f00 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
29f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
29f20 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  age->flags |= PG
29f30 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
29f40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29f50 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
29f60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29f70 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
29f80 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
29f90 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
29fa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29fb0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
29fc0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
29fd0 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
29fe0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
29ff0 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
2a000 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2a010 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2a020 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2a030 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
2a040 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
2a050 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
2a060 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
2a070 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
2a080 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
2a090 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
2a0a0 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
2a0b0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
2a0c0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
2a0d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
2a0e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2a0f0 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
2a100 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
2a110 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2a120 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66  _DIRTY;.}.#endif
2a130 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
2a140 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
2a150 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
2a160 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
2a170 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
2a180 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
2a190 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
2a1a0 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
2a1b0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
2a1c0 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
2a1d0 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
2a1e0 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65  rty.  This happe
2a1f0 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
2a200 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67   when.** the pag
2a210 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64  e has been added
2a220 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68   as a leaf of th
2a230 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73  e freelist and s
2a240 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o its.** content
2a250 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65   no longer matte
2a260 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  rs..**.** The ov
2a270 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
2a280 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
2a290 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
2a2a0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
2a2b0 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
2a2c0 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54  age is unused. T
2a2d0 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
2a2e0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
2a2f0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
2a300 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
2a310 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
2a320 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
2a330 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
2a340 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70  tion can quadrup
2a350 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
2a360 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45  large .** DELETE
2a370 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
2a380 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
2a390 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72  rDontWrite(PgHdr
2a3a0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
2a3b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2a3c0 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50  Pager;.  if( (pP
2a3d0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2a3e0 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d  IRTY) && pPager-
2a3f0 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  >nSavepoint==0 )
2a400 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
2a410 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  (("DONT_WRITE pa
2a420 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
2a430 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
2a440 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
2a450 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
2a460 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
2a470 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
2a480 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
2a490 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  = PGHDR_DONT_WRI
2a4a0 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  TE;.#ifdef SQLIT
2a4b0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
2a4c0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
2a4d0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
2a4e0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
2a4f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2a500 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2a510 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
2a520 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2a530 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a  database file .*
2a540 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  * change-counter
2a550 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d  , stored as a 4-
2a560 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
2a570 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67  integer starting
2a580 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66   at .** byte off
2a590 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61  set 24 of the pa
2a5a0 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ger file..**.** 
2a5b0 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  If the isDirectM
2a5c0 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f  ode flag is zero
2a5d0 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64  , then this is d
2a5e0 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a  one by calling .
2a5f0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ** sqlite3PagerW
2a600 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31  rite() on page 1
2a610 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  , then modifying
2a620 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2a630 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
2a640 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
2a650 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  the file will be
2a660 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68   updated when th
2a670 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61  e current.** tra
2a680 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2a690 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
2a6a0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
2a6b0 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e  ag may only be n
2a6c0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
2a6d0 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
2a6e0 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  led.** with the 
2a6f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2a700 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f  OMIC_WRITE macro
2a710 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69   defined. In thi
2a720 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73  s case,.** if is
2a730 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65  Direct is non-ze
2a740 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ro, then the dat
2a750 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70  abase file is up
2a760 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a  dated directly.*
2a770 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20  * by writing an 
2a780 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20  updated version 
2a790 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20  of page 1 using 
2a7a0 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a  a call to the .*
2a7b0 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  * sqlite3OsWrite
2a7c0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
2a7d0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2a7e0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2a7f0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
2a800 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d  r, int isDirectM
2a810 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ode){.  int rc =
2a820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
2a830 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e  * Declare and in
2a840 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e  itialize constan
2a850 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72  t integer 'isDir
2a860 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a  ect'. If the.  *
2a870 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  * atomic-write o
2a880 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65  ptimization is e
2a890 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  nabled in this b
2a8a0 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72  uild, then isDir
2a8b0 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74  ect.  ** is init
2a8c0 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
2a8d0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
2a8e0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
2a8f0 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74  parameter.  ** t
2a900 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
2a910 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
2a920 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
2a930 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
2a940 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
2a950 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   if the atomic-w
2a960 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2a970 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e  n is not.  ** en
2a980 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
2a990 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69   time, the compi
2a9a0 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65  ler can omit the
2a9b0 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27   tests of.  ** '
2a9c0 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c  isDirect' below,
2a9d0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
2a9e0 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69  block enclosed i
2a9f0 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20  n the.  ** "if( 
2aa00 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64  isDirect )" cond
2aa10 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ition..  */.#ifn
2aa20 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2aa30 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23  E_ATOMIC_WRITE.#
2aa40 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
2aa50 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20  ODE 0.  assert( 
2aa60 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20  isDirectMode==0 
2aa70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2aa80 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f  METER(isDirectMo
2aa90 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  de);.#else.# def
2aaa0 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
2aab0 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e  isDirectMode.#en
2aac0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
2aad0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2aae0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
2aaf0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
2ab00 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26  hangeCountDone &
2ab10 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
2ab20 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
2ab30 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20  *pPgHdr;        
2ab40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
2ab50 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
2ab60 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67 65  /.    u32 change
2ab70 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20  _counter;       
2ab80 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
2ab90 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63  alue of change-c
2aba0 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a  ounter field */.
2abb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2abc0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
2abd0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
2abe0 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  >fd) );..    /* 
2abf0 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
2ac00 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
2ac10 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
2ac20 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2ac30 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
2ac40 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Hdr);.    assert
2ac50 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72  ( pPgHdr==0 || r
2ac60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2ac70 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20  .    /* If page 
2ac80 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64 20  one was fetched 
2ac90 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e  successfully, an
2aca0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
2acb0 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70  is not.    ** op
2acc0 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63  erating in direc
2acd0 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67  t-mode, make pag
2ace0 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57  e 1 writable.  W
2acf0 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20  hen not in .    
2ad00 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  ** direct mode, 
2ad10 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79 73  page 1 is always
2ad20 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61   held in cache a
2ad30 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61 67  nd hence the Pag
2ad40 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61  erGet().    ** a
2ad50 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20 73  bove is always s
2ad60 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63  uccessful - henc
2ad70 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20  e the ALWAYS on 
2ad80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  rc==SQLITE_OK.. 
2ad90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44     */.    if( !D
2ada0 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c  IRECT_MODE && AL
2adb0 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f  WAYS(rc==SQLITE_
2adc0 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OK) ){.      rc 
2add0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2ade0 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ite(pPgHdr);.   
2adf0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
2ae00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ae10 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
2ae20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
2ae30 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
2ae40 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
2ae50 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67  . */.      chang
2ae60 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
2ae70 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
2ae80 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  )pPager->dbFileV
2ae90 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e  ers);.      chan
2aea0 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
2aeb0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
2aec0 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44  char*)pPgHdr->pD
2aed0 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
2aee0 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20  counter);..     
2aef0 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69   /* If running i
2af00 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77  n direct mode, w
2af10 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
2af20 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74  s of page 1 to t
2af30 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  he file. */.    
2af40 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44    if( DIRECT_MOD
2af50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  E ){.        con
2af60 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20  st void *zBuf = 
2af70 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20  pPgHdr->pData;. 
2af80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2af90 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2afa0 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  e>0 );.        r
2afb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2afc0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
2afd0 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
2afe0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
2aff0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b010 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2b020 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
2b030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b040 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
2b050 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2b060 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
2b070 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2b080 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
2b090 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
2b0a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2b0b0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
2b0c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b0d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
2b0e0 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20  e pager file to 
2b0f0 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20  disk. This is a 
2b100 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d  no-op for in-mem
2b110 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20  ory files.** or 
2b120 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
2b130 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
2b140 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
2b150 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61  uccessful, or ca
2b160 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20  lled on a pager 
2b170 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20  for which it is 
2b180 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a  a no-op, this.**
2b190 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2b1a0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  s SQLITE_OK. Oth
2b1b0 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72  erwise, an IO er
2b1c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2b1d0 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
2b1e0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61  ite3PagerSync(Pa
2b1f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2b200 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b220 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2b230 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
2b240 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
2b250 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2b260 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2b270 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2b280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b290 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
2b2a0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
2b2b0 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
2b2c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b2d0 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
2b2e0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
2b2f0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
2b300 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
2b310 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
2b320 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
2b330 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
2b340 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
2b350 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
2b360 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2b370 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
2b380 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
2b390 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
2b3a0 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
2b3b0 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
2b3c0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
2b3d0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
2b3e0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2b3f0 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  that:.**.**   * 
2b400 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2b410 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2b420 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
2b430 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20    * the journal 
2b440 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73  is synced (unles
2b450 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
2b460 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2b470 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a  is used),.**   *
2b480 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
2b490 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20   are written to 
2b4a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b4b0 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  e, .**   * the d
2b4c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2b4d0 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65  truncated (if re
2b4e0 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20  quired), and.** 
2b4f0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
2b500 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a   file synced. .*
2b510 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  *.** The only th
2b520 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73  ing that remains
2b530 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
2b540 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
2b550 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64   finalize .** (d
2b560 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20  elete, truncate 
2b570 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  or zero the firs
2b580 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a  t part of) the j
2b590 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
2b5a0 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d  .** delete the m
2b5b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2b5c0 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
2b5d0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2b5e0 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
2b5f0 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
2b600 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
2b610 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
2b620 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
2b630 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
2b640 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
2b650 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e  **.** If the fin
2b660 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e  al parameter - n
2b670 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c  oSync - is true,
2b680 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
2b690 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a  se file itself.*
2b6a0 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e  * is not synced.
2b6b0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2b6c0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2b6d0 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c  erSync() directl
2b6e0 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65  y to.** sync the
2b6f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
2b700 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f  efore calling Co
2b710 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74  mmitPhaseTwo() t
2b720 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  o delete the.** 
2b730 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
2b740 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e  this case..*/.in
2b750 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
2b760 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20  mmitPhaseOne(.  
2b770 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
2b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b790 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2b7a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2b7b0 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20  *zMaster,       
2b7c0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2b7d0 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ULL, the master 
2b7e0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
2b7f0 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20    int noSync    
2b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b810 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
2b820 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74  t the xSync on t
2b830 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b  he db file */.){
2b840 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b850 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2b860 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2b870 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 64  e */..  /* The d
2b880 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e 65 76  bOrigSize is nev
2b890 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72 6e 61  er set if journa
2b8a0 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20 20  l_mode=OFF */.  
2b8b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2b8c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2b8d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2b8e0 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  FF || pPager->db
2b8f0 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a  OrigSize==0 );..
2b900 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20    /* If a prior 
2b910 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
2b920 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
2b930 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
2b940 64 2e 20 20 52 4f 4c 4c 42 41 43 4b 0a 20 20 2a  d.  ROLLBACK.  *
2b950 2a 20 69 73 20 74 68 65 20 61 70 70 72 6f 70 72  * is the appropr
2b960 69 61 74 65 20 72 65 73 70 6f 6e 73 65 20 74 6f  iate response to
2b970 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20 43   an error, not C
2b980 4f 4d 4d 49 54 2e 20 20 47 75 61 72 64 20 61 67  OMMIT.  Guard ag
2b990 61 69 6e 73 74 0a 20 20 2a 2a 20 63 6f 64 69 6e  ainst.  ** codin
2b9a0 67 20 65 72 72 6f 72 73 20 62 79 20 72 65 70 65  g errors by repe
2b9b0 61 74 69 6e 67 20 74 68 65 20 70 72 69 6f 72 20  ating the prior 
2b9c0 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20  error. */.  if( 
2b9d0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2b9e0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2b9f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2ba00 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2ba10 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
2ba20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
2ba30 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
2ba40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
2ba50 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
2ba60 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
2ba70 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  e));..  if( MEMD
2ba80 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  B && pPager->dbM
2ba90 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20 2f  odified ){.    /
2baa0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2bab0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
2bac0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
2bad0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
2bae0 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66  or this.    ** f
2baf0 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
2bb00 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
2bb10 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20   it is mostly a 
2bb20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c  no-op.  However,
2bb30 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b   any.    ** back
2bb40 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e  up in progress n
2bb50 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61  eeds to be resta
2bb60 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
2bb70 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
2bb80 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
2bb90 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20  ackup);.  }else 
2bba0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2bbb0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
2bbc0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
2bbd0 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20 2f 2a  ified ){..    /*
2bbe0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bbf0 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65  lock updates the
2bc00 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
2bc10 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a   Exactly how it.
2bc20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73      ** does this
2bc30 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
2bc40 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
2bc50 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
2bc60 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
2bc70 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
2bc80 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e  compile time, an
2bc90 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61  d if this transa
2bca0 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20  ction meets the 
2bcb0 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20  .    ** runtime 
2bcc0 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65 20  criteria to use 
2bcd0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a  the operation: .
2bce0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2bcf0 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74   * The file-syst
2bd00 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  em supports the 
2bd10 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
2bd20 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a  perty for.    **
2bd30 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
2bd40 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
2bd50 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20 20 2a  and .    **    *
2bd60 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
2bd70 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
2bd80 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
2bd90 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
2bda0 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e      * Exactly on
2bdb0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
2bdc0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
2bdd0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
2bde0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
2bdf0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
2be00 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f  imization was no
2be10 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  t enabled at com
2be20 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20  pile time, then 
2be30 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
2be40 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2be50 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ter() function i
2be60 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61  s called to upda
2be70 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20  te the change.  
2be80 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20    ** counter in 
2be90 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e  'indirect-mode'.
2bea0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
2beb0 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64  tion is compiled
2bec0 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a 20 69   in but.    ** i
2bed0 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65  s not applicable
2bee0 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63   to this transac
2bef0 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  tion, call sqlit
2bf00 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2bf10 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  ).    ** to make
2bf20 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
2bf30 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
2bf40 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
2bf50 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
2bf60 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
2bf70 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
2bf80 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2bf90 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e  ge-counter in in
2bfa0 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20 6d 6f  direct.    ** mo
2bfb0 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  de. .    **.    
2bfc0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2bfd0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2bfe0 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65  n is both enable
2bff0 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65  d and applicable
2c000 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61  ,.    ** then ca
2c010 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ll pager_incr_ch
2c020 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
2c030 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2c040 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a  ge-counter.    *
2c050 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f  * in 'direct' mo
2c060 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
2c070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c080 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a  e will never be.
2c090 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66      ** created f
2c0a0 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
2c0b0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64  ion..    */.#ifd
2c0c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2c0d0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2c0e0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
2c0f0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2c100 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
2c110 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c120 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2c130 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
2c140 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
2c150 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2c160 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26 26 20  ->jfd) .     && 
2c170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2c180 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69  ff==jrnlBufferSi
2c190 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  ze(pPager) .    
2c1a0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
2c1b0 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze>=pPager->dbFi
2c1c0 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26 20 28  leSize.     && (
2c1d0 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65  0==(pPg = sqlite
2c1e0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
2c1f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2c200 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44  )) || 0==pPg->pD
2c210 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20 20 20  irty).    ){.   
2c220 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2c230 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
2c240 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20  counter via the 
2c250 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74  direct-write met
2c260 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20  hod. The .      
2c270 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  ** following cal
2c280 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68  l will modify th
2c290 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
2c2a0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
2c2b0 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 74  ge 1 .      ** t
2c2c0 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70  o include the up
2c2d0 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75  dated change cou
2c2e0 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
2c2f0 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20 20  ite page 1 .    
2c300 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
2c310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c320 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  le. Because of t
2c330 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2c340 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72  .      ** proper
2c350 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66  ty of the host f
2c360 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73  ile-system, this
2c370 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20   is safe..      
2c380 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2c390 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2c3a0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31  ounter(pPager, 1
2c3b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c3c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c3d0 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
2c3e0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2c3f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c410 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2c420 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2c430 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ger, 0);.      }
2c440 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
2c450 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2c460 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2c470 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e 64 69  Pager, 0);.#endi
2c480 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  f.    if( rc!=SQ
2c490 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2c4a0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2c4b0 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  exit;..    /* If
2c4c0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2c4d0 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
2c4e0 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
2c4f0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
2c500 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
2c510 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
2c520 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
2c530 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2c540 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
2c550 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ile. This can on
2c560 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  ly happen in aut
2c570 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20  o-vacuum mode.. 
2c580 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65 66     **.    ** Bef
2c590 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  ore reading the 
2c5a0 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20  pages with page 
2c5b0 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74  numbers larger t
2c5c0 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  han the .    ** 
2c5d0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
2c5e0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73   Pager.dbSize, s
2c5f0 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74  et dbSize back t
2c600 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  o the value.    
2c610 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20  ** that it took 
2c620 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2c630 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2c640 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
2c650 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
2c660 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2c670 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20  ) return zeroed 
2c680 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66  pages instead of
2c690 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67   .    ** reading
2c6a0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
2c6b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
2c6c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68 65 6e    **.    ** When
2c6d0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f   journal_mode==O
2c6e0 46 46 20 74 68 65 20 64 62 4f 72 69 67 53 69 7a  FF the dbOrigSiz
2c6f0 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f  e is always zero
2c700 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  , so this.    **
2c710 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75 6e   block never run
2c720 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  s if journal_mod
2c730 65 3d 4f 46 46 2e 0a 20 20 20 20 2a 2f 0a 23 69  e=OFF..    */.#i
2c740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c750 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2c760 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2c770 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72  ize<pPager->dbOr
2c780 69 67 53 69 7a 65 20 0a 20 20 20 20 20 26 26 20  igSize .     && 
2c790 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a  ALWAYS(pPager->j
2c7a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2c7b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2c7c0 46 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  F).    ){.      
2c7d0 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20  Pgno i;         
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2c800 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
2c810 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67  /.      const Pg
2c820 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  no iSkip = PAGER
2c830 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2c840 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63  ; /* Pending loc
2c850 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  k page */.      
2c860 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a  const Pgno dbSiz
2c870 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
2c880 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ze;       /* Dat
2c890 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65  abase image size
2c8a0 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61 67 65   */ .      pPage
2c8b0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
2c8c0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
2c8d0 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53        for( i=dbS
2c8e0 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  ize+1; i<=pPager
2c8f0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b  ->dbOrigSize; i+
2c900 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  + ){.        if(
2c910 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
2c920 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
2c930 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
2c940 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
2c950 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
2c960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c970 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c   Page to journal
2c980 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
2c990 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2c9a0 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
2c9b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2c9c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c9d0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2c9e0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2c9f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2ca00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ca10 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2ca20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2ca30 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2ca40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2ca50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2ca60 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2ca70 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
2ca80 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20  }.      } .     
2ca90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2caa0 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  = dbSize;.    }.
2cab0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
2cac0 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
2cad0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
2cae0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2caf0 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20  le. If a master 
2cb00 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2cb10 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
2cb20 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
2cb30 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2cb40 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a 20  l file, .    ** 
2cb50 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73  or if zMaster is
2cb60 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72   NULL (no master
2cb70 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20   journal), then 
2cb80 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
2cb90 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
2cba0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
2cbb0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
2cbc0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69   zMaster);.    i
2cbd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cbe0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2cbf0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2cc00 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
2cc10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
2cc20 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
2cc30 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2cc40 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  is being.    ** 
2cc50 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c 20  used, this call 
2cc60 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65 20  will not create 
2cc70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cc80 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a   or perform any.
2cc90 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a      ** real IO..
2cca0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2ccb0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2ccc0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
2ccd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2cce0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2ccf0 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  ne_exit;..    /*
2cd00 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
2cd10 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
2cd20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2cd30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2cd40 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73 71  rite_pagelist(sq
2cd50 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2cd60 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2cd70 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66 28 20  ache));.    if( 
2cd80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2cd90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2cda0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
2cdb0 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20  BLOCKED );.     
2cdc0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2cdd0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
2cde0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63   }.    sqlite3Pc
2cdf0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
2ce00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
2ce10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
2ce20 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f  le on disk is no
2ce30 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  t the same size 
2ce40 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
2ce50 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74 68  image,.    ** th
2ce60 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72 75  en use pager_tru
2ce70 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72  ncate to grow or
2ce80 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65   shrink the file
2ce90 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
2cea0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2ceb0 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62  Size!=pPager->db
2cec0 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
2ced0 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
2cee0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
2cef0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
2cf00 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2cf10 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 61 73  ager));.      as
2cf20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2cf30 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
2cf40 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72 63  SIVE );.      rc
2cf50 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
2cf60 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b  e(pPager, nNew);
2cf70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2cf80 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2cf90 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2cfa0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  _exit;.    }..  
2cfb0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79    /* Finally, sy
2cfc0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
2cfd0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
2cfe0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
2cff0 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20   && !noSync ){. 
2d000 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d010 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
2d020 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
2d030 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20  _flags);.    }. 
2d040 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
2d050 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
2d060 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  r))..    pPager-
2d070 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
2d080 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d  YNCED;.  }..comm
2d090 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2d0a0 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
2d0b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  }.../*.** When t
2d0c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d0d0 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61  called, the data
2d0e0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
2d0f0 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a  en completely.**
2d100 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
2d110 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20  ect the changes 
2d120 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72  made by the curr
2d130 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2d140 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f  and.** synced to
2d150 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e   disk. The journ
2d160 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  al file still ex
2d170 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2d180 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75  -system .** thou
2d190 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69  gh, and if a fai
2d1a0 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74  lure occurs at t
2d1b0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c  his point it wil
2d1c0 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  l eventually.** 
2d1d0 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74  be used as a hot
2d1e0 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65  -journal and the
2d1f0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2d200 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  tion rolled back
2d210 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d220 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20  ction finalizes 
2d230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d240 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65  , either by dele
2d250 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61  ting, .** trunca
2d260 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c  ting or partiall
2d270 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f  y zeroing it, so
2d280 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20   that it cannot 
2d290 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
2d2a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
2d2b0 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20  back. Once this 
2d2c0 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e  is done the tran
2d2d0 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72  saction is.** ir
2d2e0 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74  revocably commit
2d2f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
2d300 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
2d310 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2d320 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2d330 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76  the pager.** mov
2d340 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  es into the erro
2d350 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  r state. Otherwi
2d360 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
2d370 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2d380 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
2d390 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67  mmitPhaseTwo(Pag
2d3a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2d3b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d3c0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2d3d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d3e0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
2d3f0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2d400 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66  not be called if
2d410 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68   a prior error h
2d420 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a  as occurred..  *
2d430 2a 20 42 75 74 20 69 66 20 28 64 75 65 20 74 6f  * But if (due to
2d440 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2d450 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68 65  elsewhere in the
2d460 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73   system) it does
2d470 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64   get.  ** called
2d480 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  , just return th
2d490 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64  e same error cod
2d4a0 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  e without doing 
2d4b0 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69  anything. */.  i
2d4c0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2d4d0 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
2d4e0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2d4f0 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  de;..  /* This f
2d500 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  unction should n
2d510 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ot be called if 
2d520 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
2d530 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a   in at least.  *
2d540 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
2d550 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65   state. And inde
2d560 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  ed SQLite never 
2d570 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20 69  does this. But i
2d580 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74  t is.  ** nice t
2d590 6f 20 68 61 76 65 20 74 68 69 73 20 64 65 66 65  o have this defe
2d5a0 6e 73 69 76 65 20 74 65 73 74 20 68 65 72 65 20  nsive test here 
2d5b0 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69  anyway..  */.  i
2d5c0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2d5d0 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
2d5e0 45 52 56 45 44 29 20 29 20 72 65 74 75 72 6e 20  ERVED) ) return 
2d5f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
2d600 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74   /* An optimizat
2d610 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61  ion. If the data
2d620 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74  base was not act
2d630 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64  ually modified d
2d640 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20  uring.  ** this 
2d650 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2d660 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
2d670 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
2d680 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20  ode and is.  ** 
2d690 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74  using persistent
2d6a0 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
2d6b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d6c0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
2d6d0 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66   ** The start of
2d6e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d6f0 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
2d700 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f  ains a single jo
2d710 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
2d720 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  er with the nRec
2d730 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e   field set to 0.
2d740 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e   If such a journ
2d750 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20 20  al is used as.  
2d760 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
2d770 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
2d780 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20  nal rollback, 0 
2d790 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
2d7a0 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  made.  ** to the
2d7b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d7c0 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  So there is no n
2d7d0 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20  eed to zero the 
2d7e0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
2d7f0 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20  ader. Since the 
2d800 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
2d810 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72  usive mode, ther
2d820 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a  e is no need.  *
2d830 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f  * to drop any lo
2d840 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f  cks either..  */
2d850 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2d860 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20  bModified==0 && 
2d870 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2d880 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61  eMode .   && pPa
2d890 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2d8a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2d8b0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b  ODE_PERSIST.  ){
2d8c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2d8d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
2d8e0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
2d8f0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
2d900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d910 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2d920 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE(("COMMIT %d\n
2d930 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2d940 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r)));.  assert( 
2d950 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
2d960 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d  AGER_SYNCED || M
2d970 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d  EMDB || !pPager-
2d980 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20  >dbModified );. 
2d990 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2d9a0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2d9b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2d9c0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
2d9d0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2d9e0 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ger, rc);.}../*.
2d9f0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
2da00 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74  changes. The dat
2da10 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
2da20 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
2da30 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   mode..**.** Thi
2da40 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
2da50 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a  rms two tasks:.*
2da60 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c  *.**   1) It rol
2da70 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  ls back the jour
2da80 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72  nal file, restor
2da90 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ing all database
2daa0 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20   file and .**   
2dab0 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63     in-memory cac
2dac0 68 65 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  he pages to the 
2dad0 73 74 61 74 65 20 74 68 65 79 20 77 65 72 65 20  state they were 
2dae0 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  in when the tran
2daf0 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  saction.**      
2db00 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a  was opened, and.
2db10 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c  **   2) It final
2db20 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
2db30 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69   file, so that i
2db40 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f  t is not used fo
2db50 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f  r hot.**      ro
2db60 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f  llback at any po
2db70 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
2db80 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74  e..**.** subject
2db90 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2dba0 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73  g qualifications
2dbb0 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  :.**.** * If the
2dbc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2dbd0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68   not yet open wh
2dbe0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2dbf0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
2dc00 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69   then only (2) i
2dc10 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20  s performed. In 
2dc20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2dc30 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  is no journal fi
2dc40 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20  le.**   to roll 
2dc50 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  back..**.** * If
2dc60 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
2dc70 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
2dc80 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20  LITE_FULL, then 
2dc90 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20  task (1) is .** 
2dca0 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20    performed. If 
2dcb0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b  successful, task
2dcc0 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73   (2). Regardless
2dcd0 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a   of the outcome.
2dce0 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20  **   of either, 
2dcf0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2dd00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2dd10 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
2dd20 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20  ller.**   (i.e. 
2dd30 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
2dd40 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  ERR or SQLITE_CO
2dd50 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20  RRUPT)..**.** * 
2dd60 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2dd70 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  in PAGER_RESERVE
2dd80 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  D state, then at
2dd90 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68  tempt (1). Wheth
2dda0 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28  er.**   or not (
2ddb0 31 29 20 69 73 20 73 75 63 63 75 73 73 66 75 6c  1) is succussful
2ddc0 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28  , also attempt (
2ddd0 32 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  2). If successfu
2dde0 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53  l, return.**   S
2ddf0 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
2de00 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65  ise, enter the e
2de10 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
2de20 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
2de30 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65  .**   error code
2de40 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a   encountered. .*
2de50 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
2de60 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
2de70 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
2de80 64 61 74 61 62 61 73 65 20 77 61 73 20 77 72 69  database was wri
2de90 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53  tten to. .**   S
2dea0 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e  o is safe to fin
2deb0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2dec0 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74  l file even if t
2ded0 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20  he playback .** 
2dee0 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20    (operation 1) 
2def0 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20  failed. However 
2df00 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 65  the pager must e
2df10 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
2df20 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65  tate.**   as the
2df30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2df40 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2df50 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74   are now suspect
2df60 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c  ..**.** * Finall
2df70 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45  y, if in PAGER_E
2df80 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
2df90 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2dfa0 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65  . Only.**   atte
2dfb0 6d 70 74 20 28 32 29 20 69 66 20 28 31 29 20 69  mpt (2) if (1) i
2dfc0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65  s successful. Re
2dfd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2dfe0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
2dff0 20 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74     otherwise ent
2e000 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2e010 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
2e020 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  e error code fro
2e030 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c  m the .**   fail
2e040 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ing operation..*
2e050 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
2e060 61 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ase the database
2e070 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62   file may have b
2e080 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  een written to. 
2e090 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70  So if the.**   p
2e0a0 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  layback operatio
2e0b0 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65  n did not succee
2e0c0 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62  d it would not b
2e0d0 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69  e safe to finali
2e0e0 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72  ze.**   the jour
2e0f0 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65  nal file. It nee
2e100 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e  ds to be left in
2e110 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2e120 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f   so that.**   so
2e130 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
2e140 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72   can use it to r
2e150 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
2e160 61 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a  ase state (by.**
2e170 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72     hot-journal r
2e180 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74  ollback)..*/.int
2e190 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
2e1a0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
2e1b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2e1c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e1e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2e1f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52 4f   PAGERTRACE(("RO
2e200 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
2e210 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
2e220 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2e230 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69  dbModified || !i
2e240 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2e250 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  d) ){.    rc = p
2e260 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2e270 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2e280 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2e290 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
2e2a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
2e2b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
2e2c0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
2e2d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e2e0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
2e2f0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
2e300 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2e310 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
2e320 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
2e330 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
2e340 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
2e350 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
2e360 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
2e370 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
2e380 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
2e390 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2e3a0 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70 61  ;.      rc2 = pa
2e3b0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2e3c0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
2e3d0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
2e3e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e3f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e400 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
2e410 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2e420 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2e430 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
2e440 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
2e450 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
2e460 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
2e470 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
2e480 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
2e490 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
2e4a0 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
2e4b0 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
2e4c0 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
2e4d0 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  er.    ** cache.
2e4e0 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
2e4f0 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
2e500 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
2e510 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20  y error .    ** 
2e520 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20  persistent..    
2e530 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2e540 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2e550 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
2e560 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2e570 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2e580 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e590 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
2e5a0 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
2e5b0 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
2e5c0 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
2e5d0 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
2e5e0 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67 65  /.u8 sqlite3Page
2e5f0 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
2e600 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2e610 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
2e620 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
2e630 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2e640 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2e650 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
2e660 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2e670 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
2e680 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2e690 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
2e6a0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2e6b0 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
2e6c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2e6d0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2e6e0 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63 69  ces to the speci
2e6f0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e  fied page..*/.in
2e700 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
2e710 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67  geRefcount(DbPag
2e720 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
2e730 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
2e740 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
2e750 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  age);.}..#ifdef 
2e760 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
2e770 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2e780 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
2e790 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
2e7a0 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
2e7b0 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28  lite3PagerStats(
2e7c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e7d0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
2e7e0 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c  1];.  a[0] = sql
2e7f0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
2e800 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2e810 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71  he);.  a[1] = sq
2e820 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
2e830 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2e840 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20  ache);.  a[2] = 
2e850 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 74  sqlite3PcacheGet
2e860 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
2e870 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2e880 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
2e890 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29  izeValid ? (int)
2e8a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2e8b0 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  : -1;.  a[4] = p
2e8c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
2e8d0 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
2e8e0 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
2e8f0 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
2e900 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
2e910 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
2e920 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
2e930 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
2e940 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
2e950 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
2e960 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
2e970 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
2e980 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2e990 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2e9a0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2e9b0 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69  mory pager..*/.i
2e9c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
2e9d0 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50  sMemdb(Pager *pP
2e9e0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2e9f0 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  MEMDB;.}../*.** 
2ea00 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  Check that there
2ea10 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53   are at least nS
2ea20 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69  avepoint savepoi
2ea30 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65  nts open. If the
2ea40 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  re are.** curren
2ea50 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53  tly less than nS
2ea60 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20  avepoints open, 
2ea70 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72  then open one or
2ea80 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
2ea90 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74  .** to make up t
2eaa0 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49  he difference. I
2eab0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
2eac0 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c  savepoints is al
2ead0 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74  ready.** equal t
2eae0 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68  o nSavepoint, th
2eaf0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2eb00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2eb10 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
2eb20 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
2eb30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
2eb40 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2eb50 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
2eb60 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20  s while opening 
2eb70 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2eb80 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f  file, then an IO
2eb90 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a   error code is.*
2eba0 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  * returned. Othe
2ebb0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
2ebc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ebd0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
2ebe0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2ebf0 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74  , int nSavepoint
2ec00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2ec10 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ec30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2ec40 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20  .  int nCurrent 
2ec50 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  = pPager->nSavep
2ec60 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  oint;        /* 
2ec70 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  Current number o
2ec80 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  f savepoints */.
2ec90 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e  .  if( nSavepoin
2eca0 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50  t>nCurrent && pP
2ecb0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2ecc0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   ){.    int ii; 
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecf0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2ed00 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65  able */.    Page
2ed10 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77  rSavepoint *aNew
2ed20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ed30 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72      /* New Pager
2ed40 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
2ed50 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69 74  y */..    /* Eit
2ed60 68 65 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20  her there is no 
2ed70 61 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20 6f  active journal o
2ed80 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  r the sub-journa
2ed90 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20 20  l is open or .  
2eda0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
2edb0 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65   is always store
2edc0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  d in memory */. 
2edd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ede0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
2edf0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
2ee00 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20 20  r->sjfd) ||.    
2ee10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2ee20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2ee30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2ee40 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f 2a  EMORY );..    /*
2ee50 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e   Grow the Pager.
2ee60 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79  aSavepoint array
2ee70 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29   using realloc()
2ee80 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
2ee90 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20  NOMEM.    ** if 
2eea0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
2eeb0 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  ails. Otherwise,
2eec0 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f   zero the new po
2eed0 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20  rtion in case a 
2eee0 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66  .    ** malloc f
2eef0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
2ef00 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69  ile populating i
2ef10 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e  t in the for(...
2ef20 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20  ) loop below..  
2ef30 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20    */.    aNew = 
2ef40 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20  (PagerSavepoint 
2ef50 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
2ef60 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  (.        pPager
2ef70 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69  ->aSavepoint, si
2ef80 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f  zeof(PagerSavepo
2ef90 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a  int)*nSavepoint.
2efa0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
2efb0 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65  aNew ){.      re
2efc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2efd0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
2efe0 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72 65  set(&aNew[nCurre
2eff0 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f  nt], 0, (nSavepo
2f000 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20  int-nCurrent) * 
2f010 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
2f020 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50 61  point));.    pPa
2f030 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
2f040 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61 67  = aNew;.    pPag
2f050 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
2f060 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20   nSavepoint;..  
2f070 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
2f080 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2f090 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73 74   structures just
2f0a0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20   allocated. */. 
2f0b0 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65     for(ii=nCurre
2f0c0 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e  nt; ii<nSavepoin
2f0d0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t; ii++){.      
2f0e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f0f0 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
2f100 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f       aNew[ii].nO
2f110 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  rig = pPager->db
2f120 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
2f130 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f140 66 64 29 20 26 26 20 41 4c 57 41 59 53 28 70 50  fd) && ALWAYS(pP
2f150 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2f160 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >0) ){.        a
2f170 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20  New[ii].iOffset 
2f180 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2f190 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lOff;.      }els
2f1a0 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  e{.        aNew[
2f1b0 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f  ii].iOffset = JO
2f1c0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
2f1d0 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
2f1e0 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75      aNew[ii].iSu
2f1f0 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  bRec = pPager->n
2f200 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e  SubRec;.      aN
2f210 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
2f220 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  int = sqlite3Bit
2f230 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
2f240 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20  ->dbSize);.     
2f250 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70   if( !aNew[ii].p
2f260 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  InSavepoint ){. 
2f270 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2f280 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f290 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2f2a0 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
2f2b0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
2f2c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
2f2d0 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ned. */.    rc =
2f2e0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2f2f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
2f300 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
2f310 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  raint(pPager);. 
2f320 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2f330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2f340 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2f350 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  d to rollback or
2f360 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
2f370 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ) a savepoint..*
2f380 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * The savepoint 
2f390 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  to release or ro
2f3a0 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20  llback need not 
2f3b0 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  be the most rece
2f3c0 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64  ntly .** created
2f3d0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
2f3e0 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69  * Parameter op i
2f3f0 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
2f400 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2f410 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  CK or SAVEPOINT_
2f420 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69  RELEASE..** If i
2f430 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
2f440 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c  ELEASE, then rel
2f450 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79  ease and destroy
2f460 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77   the savepoint w
2f470 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61  ith.** index iSa
2f480 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69  vepoint. If it i
2f490 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
2f4a0 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62  BACK, then rollb
2f4b0 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a  ack all changes.
2f4c0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63 63  ** that have occ
2f4d0 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20  urred since the 
2f4e0 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f  specified savepo
2f4f0 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e  int was created.
2f500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70  .**.** The savep
2f510 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  oint to rollback
2f520 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73 20 69   or release is i
2f530 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
2f540 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65  ameter .** iSave
2f550 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f  point. A value o
2f560 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65  f 0 means to ope
2f570 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  rate on the oute
2f580 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a  rmost savepoint.
2f590 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20 63 72  ** (the first cr
2f5a0 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20  eated). A value 
2f5b0 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  of (Pager.nSavep
2f5c0 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70  oint-1) means op
2f5d0 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20  erate.** on the 
2f5e0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
2f5f0 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  eated savepoint.
2f600 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69   If iSavepoint i
2f610 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a  s greater than.*
2f620 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  * (Pager.nSavepo
2f630 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69  int-1), then thi
2f640 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
2f650 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
2f660 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
2f670 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
2f680 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
2f690 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
2f6a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2f6b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
2f6c0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 74  s is different t
2f6d0 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  o calling .** sq
2f6e0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
2f6f0 63 6b 28 29 20 62 65 63 61 75 73 65 20 74 68 69  ck() because thi
2f700 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2f710 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a  not terminate.**
2f720 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2f730 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   or unlock the d
2f740 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74  atabase, it just
2f750 20 72 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a   restores the .*
2f760 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
2f770 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
2f780 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
2f790 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20  . .**.** In any 
2f7a0 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f  case, all savepo
2f7b0 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64  ints with an ind
2f7c0 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
2f7d0 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61  iSavepoint .** a
2f7e0 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66  re destroyed. If
2f7f0 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61   this is a relea
2f800 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70  se operation (op
2f810 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
2f820 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61  ASE),.** then sa
2f830 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69  vepoint iSavepoi
2f840 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72  nt is also destr
2f850 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oyed..**.** This
2f860 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2f870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f880 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M if a memory al
2f890 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
2f8a0 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  ** or an IO erro
2f8b0 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20  r code if an IO 
2f8c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2f8d0 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  le rolling back 
2f8e0 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  a .** savepoint.
2f8f0 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63   If no errors oc
2f900 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
2f910 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  s returned..*/ .
2f920 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2f930 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
2f940 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c  *pPager, int op,
2f950 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
2f960 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2f970 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2f980 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
2f990 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
2f9a0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2f9b0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2f9c0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
2f9d0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
2f9e0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66  OLLBACK );..  if
2f9f0 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61  ( iSavepoint<pPa
2fa00 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2fa10 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  ){.    int ii;  
2fa20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2fa30 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
2fa40 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20  /.    int nNew; 
2fa50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2fa60 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20  er of remaining 
2fa70 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72  savepoints after
2fa80 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20   this op. */..  
2fa90 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
2faa0 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69  how many savepoi
2fab0 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62  nts will still b
2fac0 65 20 61 63 74 69 76 65 20 61 66 74 65 72 20 74  e active after t
2fad0 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  his.    ** opera
2fae0 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73  tion. Store this
2faf0 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20   value in nNew. 
2fb00 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72  Then free resour
2fb10 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ces associated .
2fb20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
2fb30 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20  savepoints that 
2fb40 61 72 65 20 64 65 73 74 72 6f 79 65 64 20 62 79  are destroyed by
2fb50 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
2fb60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77  .    */.    nNew
2fb70 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20   = iSavepoint + 
2fb80 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  (( op==SAVEPOINT
2fb90 5f 52 45 4c 45 41 53 45 20 29 20 3f 20 30 20 3a  _RELEASE ) ? 0 :
2fba0 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   1);.    for(ii=
2fbb0 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d  nNew; ii<pPager-
2fbc0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
2fbd0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2fbe0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
2fbf0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
2fc00 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
2fc10 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
2fc20 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2fc30 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f  t = nNew;..    /
2fc40 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
2fc50 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
2fc60 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
2fc70 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
2fc80 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
2fc90 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  nal to zero byte
2fca0 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20  s in size. */.  
2fcb0 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
2fcc0 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20  INT_RELEASE ){. 
2fcd0 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30       if( nNew==0
2fce0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2fcf0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
2fd00 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e      /* Only trun
2fd10 63 61 74 65 20 69 66 20 69 74 20 69 73 20 61 6e  cate if it is an
2fd20 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
2fd30 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
2fd40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
2fd50 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
2fd60 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
2fd70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fd80 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
2fd90 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20  ger->sjfd, 0);. 
2fda0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2fdb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2fdc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fdd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
2fde0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Rec = 0;.      }
2fdf0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 6c  .    }.    /* El
2fe00 73 65 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  se this is a rol
2fe10 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c  lback operation,
2fe20 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70   playback the sp
2fe30 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
2fe40 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  t..    ** If thi
2fe50 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  s is a temp-file
2fe60 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2fe70 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2fe80 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a  l file has.    *
2fe90 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
2fea0 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
2feb0 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62  ase there have b
2fec0 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
2fed0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
2fee0 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74  abase file, so t
2fef0 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72  he playback oper
2ff00 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69  ation can be ski
2ff10 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
2ff20 20 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e   else if( isOpen
2ff30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
2ff40 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65  .      PagerSave
2ff50 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
2ff60 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a  t = (nNew==0)?0:
2ff70 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
2ff80 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20  int[nNew-1];.   
2ff90 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61     rc = pagerPla
2ffa0 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70  ybackSavepoint(p
2ffb0 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e  Pager, pSavepoin
2ffc0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
2ffd0 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc!=SQLITE_DONE
2ffe0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a  );.    }.  .  }.
2fff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30000 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
30010 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
30020 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30030 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
30040 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
30050 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
30060 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
30070 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
30080 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
30090 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
300a0 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
300b0 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
300c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
300d0 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
300e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
300f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
30100 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
30110 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
30120 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
30130 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
30140 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
30150 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
30160 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
30170 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
30180 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
30190 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
301a0 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
301b0 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
301c0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
301d0 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
301e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
301f0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
30200 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
30210 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
30220 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
30230 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(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 4a 6f  turn pPager->zJo
30260 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
30270 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
30280 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
30290 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
302a0 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
302b0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
302c0 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
302d0 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
302e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
302f0 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
30300 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
30310 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
30320 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
30330 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
30340 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69 65 76  * Set or retriev
30350 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  e the codec for 
30360 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74  this pager.*/.st
30370 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
30380 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
30390 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
303a0 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
303b0 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
303c0 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
303d0 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
303e0 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
303f0 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
30400 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a  ecFree)(void*),.
30410 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29    void *pCodec.)
30420 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
30430 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
30440 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
30450 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
30460 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
30470 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  c = pPager->memD
30480 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b 0a  b ? 0 : xCodec;.
30490 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
304a0 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64 65  SizeChng = xCode
304b0 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50 61  cSizeChng;.  pPa
304c0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
304d0 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20 20  = xCodecFree;.  
304e0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20 3d  pPager->pCodec =
304f0 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65 72   pCodec;.  pager
30500 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
30510 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  r);.}.static voi
30520 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
30530 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70  etCodec(Pager *p
30540 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
30550 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b   pPager->pCodec;
30560 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
30570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
30580 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
30590 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
305a0 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
305b0 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
305c0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
305d0 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
305e0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
305f0 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
30600 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
30610 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
30620 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
30630 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
30640 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
30650 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
30660 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
30670 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
30680 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
30690 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
306a0 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
306b0 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
306c0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
306d0 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
306e0 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
306f0 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
30700 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
30710 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
30720 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
30730 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
30740 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
30750 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
30760 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
30770 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
30780 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
30790 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
307a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
307b0 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
307c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
307d0 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
307e0 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
307f0 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
30800 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
30810 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
30820 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
30830 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
30840 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
30850 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
30860 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
30870 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
30880 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
30890 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ive)..**.** If t
308a0 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
308b0 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73  nt, isCommit, is
308c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
308d0 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69  this page is bei
308e0 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70  ng.** moved as p
308f0 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  art of a databas
30900 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e  e reorganization
30910 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
30920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
30930 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
30940 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
30950 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  e, it is guarant
30960 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74  eed that the dat
30970 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70  abase page .** p
30980 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c  Pg refers to wil
30990 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
309a0 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e   to again within
309b0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
309c0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  n..**.** This fu
309d0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
309e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  n SQLITE_NOMEM o
309f0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
30a00 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
30a10 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72 77  * occurs. Otherw
30a20 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ise, it returns 
30a30 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
30a40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
30a50 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
30a60 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
30a70 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e  g, Pgno pgno, in
30a80 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  t isCommit){.  P
30a90 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20  gHdr *pPgOld;   
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30ab0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
30ac0 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
30ad0 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
30ae0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  o = 0;       /* 
30af0 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67  Old value of pPg
30b00 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20  ->pgno, if sync 
30b10 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  is required */. 
30b20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
30b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30b40 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
30b50 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b    Pgno origPgno;
30b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b70 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  * The original p
30b80 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  age number */.. 
30b90 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
30ba0 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  ef>0 );..  /* In
30bb0 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62 6c   order to be abl
30bc0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  e to rollback, a
30bd0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
30be0 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61  base must journa
30bf0 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  l.  ** the page 
30c00 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66 72  we are moving fr
30c10 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  om..  */.  if( M
30c20 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d  EMDB ){.    rc =
30c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30c40 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  te(pPg);.    if(
30c50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30c60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
30c70 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76  e page being mov
30c80 65 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20  ed is dirty and 
30c90 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76  has not been sav
30ca0 65 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74  ed by the latest
30cb0 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c  .  ** savepoint,
30cc0 20 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63   then save the c
30cd0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
30ce0 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  of the page into
30cf0 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
30d00 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73  ournal now. This
30d10 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
30d20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f  handle the follo
30d30 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20  wing scenario:. 
30d40 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e   **.  **   BEGIN
30d50 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72  ;.  **     <jour
30d60 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e  nal page X, then
30d70 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65   modify it in me
30d80 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53  mory>.  **     S
30d90 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
30da0 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70  **       <Move p
30db0 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f  age X to locatio
30dc0 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f  n Y>.  **     RO
30dd0 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20  LLBACK TO one;. 
30de0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65   **.  ** If page
30df0 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74   X were not writ
30e00 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
30e10 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20  ournal here, it 
30e20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  would not.  ** b
30e30 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65  e possible to re
30e40 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e  store its conten
30e50 74 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ts when the "ROL
30e60 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20  LBACK TO one".  
30e70 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72  ** statement wer
30e80 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a  e is processed..
30e90 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75    **.  ** subjou
30ea0 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e  rnalPage() may n
30eb0 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  eed to allocate 
30ec0 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70  space to store p
30ed0 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20  Pg->pgno into.  
30ee0 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ** one or more s
30ef0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
30f00 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65  . This is the re
30f10 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ason this functi
30f20 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  on.  ** may retu
30f30 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
30f40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
30f50 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
30f60 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71  TY.   && subjReq
30f70 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
30f80 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
30f90 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c  (rc = subjournal
30fa0 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a  Page(pPg)).  ){.
30fb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30fc0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
30fd0 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  (("MOVE %d page 
30fe0 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
30ff0 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
31000 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
31010 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
31020 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  no, (pPg->flags&
31030 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
31040 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ?1:0, pgno));.  
31050 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
31060 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
31070 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
31080 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74  gno))..  /* If t
31090 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
310a0 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
310b0 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
310c0 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
310d0 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
310e0 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
310f0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
31100 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
31110 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
31120 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
31130 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
31140 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
31150 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
31160 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
31170 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
31180 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
31190 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
311a0 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
311b0 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
311c0 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
311d0 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
311e0 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
311f0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
31200 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
31210 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
31220 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
31230 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
31240 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
31250 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
31260 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
31270 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
31280 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
31290 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
312a0 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
312b0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
312c0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
312d0 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
312e0 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
312f0 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
31300 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
31310 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
31320 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
31330 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
31340 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
31350 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
31360 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
31370 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
31380 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
31390 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
313a0 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
313b0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
313c0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
313d0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
313e0 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
313f0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
31400 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
31410 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
31420 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
31430 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
31440 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
31450 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
31460 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
31470 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
31480 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
31490 64 69 73 63 61 72 64 20 70 61 67 65 73 20 66 72  discard pages fr
314a0 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
314b0 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20 77  database since w
314c0 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a  e might.      **
314d0 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
314e0 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20 6d  k later.  Just m
314f0 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f 75 74  ove the page out
31500 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a   of the way. */.
31510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
31520 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
31530 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
31540 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
31550 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  Old, pPager->dbS
31560 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ize+1);.    }els
31570 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
31580 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c  PcacheDrop(pPgOl
31590 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
315a0 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d   origPgno = pPg-
315b0 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  >pgno;.  sqlite3
315c0 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20  PcacheMove(pPg, 
315d0 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  pgno);.  sqlite3
315e0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
315f0 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
31600 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
31610 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
31620 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
31630 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
31640 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
31650 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31660 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
31670 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
31680 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
31690 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
316a0 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
316b0 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
316c0 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
316d0 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
316e0 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
316f0 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
31700 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
31710 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
31720 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
31730 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
31740 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
31750 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
31760 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
31770 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
31780 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
31790 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
317a0 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
317b0 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
317c0 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
317d0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
317e0 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
317f0 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
31800 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
31810 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
31820 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
31830 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
31840 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
31850 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
31860 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
31870 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
31880 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
31890 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
318a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
318b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
318c0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
318d0 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
318e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
318f0 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
31900 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
31910 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
31920 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
31930 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
31940 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
31950 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
31960 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
31970 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
31980 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
31990 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
319a0 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
319b0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
319c0 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
319d0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
319e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
319f0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
31a00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31a10 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
31a20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
31a30 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
31a40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31a50 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53  .      if( needS
31a60 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
31a70 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
31a80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
31a90 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
31aa0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
31ab0 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
31ac0 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
31ad0 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
31ae0 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  no, pPager->pTmp
31af0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Space);.      }.
31b00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
31b10 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
31b20 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
31b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31b40 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
31b50 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  & !MEMDB );.    
31b60 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d  pPgHdr->flags |=
31b70 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
31b80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
31b90 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
31ba0 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
31bb0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
31bc0 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dr);.  }..  /*. 
31bd0 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65   ** For an in-me
31be0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d  mory database, m
31bf0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69  ake sure the ori
31c00 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69  ginal page conti
31c10 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69  nues.  ** to exi
31c20 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  st, in case the 
31c30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
31c40 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  s to roll back. 
31c50 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a   Use pPgOld.  **
31c60 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
31c70 20 70 61 67 65 20 73 69 6e 63 65 20 69 74 20 68   page since it h
31c80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
31c90 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a  allocated..  */.
31ca0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
31cb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
31cc0 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69  Move(pPgOld, ori
31cd0 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69  gPgno);.    sqli
31ce0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
31cf0 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  gOld);.  }..  re
31d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31d10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
31d20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
31d30 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
31d40 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
31d50 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
31d60 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
31d70 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
31d80 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
31d90 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50  Ref>0 || pPg->pP
31da0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
31db0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
31dc0 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
31dd0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
31de0 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
31df0 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
31e00 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
31e10 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
31e20 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
31e30 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
31e40 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
31e50 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
31e60 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
31e70 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExtra;.}../*.**
31e80 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
31e90 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
31ea0 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
31eb0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
31ec0 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
31ed0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
31ee0 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
31ef0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
31f00 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
31f10 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
31f20 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
31f30 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
31f40 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
31f50 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
31f60 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
31f70 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
31f80 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
31f90 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
31fa0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
31fb0 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
31fc0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
31fd0 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
31fe0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
31ff0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
32000 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
32010 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
32020 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
32030 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
32040 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
32050 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
32060 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
32070 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
32080 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
32090 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
320a0 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
320b0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
320c0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
320d0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
320e0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
320f0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
32100 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
32110 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
32120 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
32130 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
32140 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
32150 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
32160 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
32170 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
32180 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
32190 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
321a0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
321b0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
321c0 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
321d0 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  /set the journal
321e0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
321f0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
32200 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
32210 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50  e of:.**.**    P
32220 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32230 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47  _QUERY.**    PAG
32240 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
32250 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  ELETE.**    PAGE
32260 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
32270 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47  UNCATE.**    PAG
32280 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
32290 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47  ERSIST.**    PAG
322a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
322b0 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  FF.**    PAGER_J
322c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
322d0 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  Y.**.** If the p
322e0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
322f0 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65  _QUERY, then the
32300 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73   journal_mode is
32310 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76   set to the.** v
32320 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20 69  alue specified i
32330 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20  f the change is 
32340 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 63 68  allowed.  The ch
32350 61 6e 67 65 20 69 73 20 64 69 73 61 6c 6c 6f 77  ange is disallow
32360 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f  ed.** for the fo
32370 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a  llowing reasons:
32380 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69  .**.**   *  An i
32390 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
323a0 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20  e can only have 
323b0 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  its journal_mode
323c0 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20   set to _OFF.** 
323d0 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e       or _MEMORY.
323e0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
323f0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79  journal mode may
32400 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20   not be changed 
32410 77 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74  while a transact
32420 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
32430 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
32440 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63  d indicate the c
32450 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
32460 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61   updated) journa
32470 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-mode..*/.int s
32480 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
32490 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
324a0 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
324b0 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
324c0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
324d0 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
324e0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
324f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32500 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DE_DELETE.      
32510 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32520 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32530 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20  E_TRUNCATE.     
32540 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
32550 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32560 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
32570 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
32580 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32590 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
325a0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
325b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
325c0 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73 65  MEMORY );.  asse
325d0 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  rt( PAGER_JOURNA
325e0 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  LMODE_QUERY<0 );
325f0 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a  .  if( eMode>=0.
32600 20 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c     && (!MEMDB ||
32610 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
32620 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
32630 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
32640 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
32650 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29  JOURNALMODE_OFF)
32660 0a 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e  .   && !pPager->
32670 64 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26 26  dbModified.   &&
32680 20 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   (!isOpen(pPager
32690 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61  ->jfd) || 0==pPa
326a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
326b0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  .  ){.    if( is
326c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
326d0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
326e0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
326f0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  ->jfd);.    }.  
32700 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32710 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  lMode = (u8)eMod
32720 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
32730 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75  (int)pPager->jou
32740 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  rnalMode;.}../*.
32750 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73  ** Get/set the s
32760 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66  ize-limit used f
32770 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  or persistent jo
32780 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
32790 2a 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73  ** Setting the s
327a0 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20  ize limit to -1 
327b0 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69  means no limit i
327c0 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41  s enforced..** A
327d0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74  n attempt to set
327e0 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72   a limit smaller
327f0 20 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f   than -1 is a no
32800 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  -op..*/.i64 sqli
32810 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
32820 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  izeLimit(Pager *
32830 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d  pPager, i64 iLim
32840 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69  it){.  if( iLimi
32850 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61  t>=-1 ){.    pPa
32860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
32870 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a  Limit = iLimit;.
32880 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
32890 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
328a0 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Limit;.}../*.** 
328b0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
328c0 20 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e   to the pPager->
328d0 70 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65  pBackup variable
328e0 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64  . The backup mod
328f0 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70  ule.** in backup
32900 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65  .c maintains the
32910 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
32920 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20   variable. This 
32930 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69  module.** uses i
32940 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e  t opaquely as an
32950 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
32960 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
32970 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74  t() and.** sqlit
32980 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29  e3BackupUpdate()
32990 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65   only..*/.sqlite
329a0 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74  3_backup **sqlit
329b0 65 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72  e3PagerBackupPtr
329c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
329d0 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65  .  return &pPage
329e0 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23  r->pBackup;.}..#
329f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
32a00 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a     OMIT_DISKIO */.