/ Hex Artifact Content
Login

Artifact 80688c6fee918b7d9aa1c4911a0094d0ebbde31e:


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 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e90 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
13ea0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
13eb0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
13ec0 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
13ed0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
13ee0 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
13ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13f00 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
13f10 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
13f20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
13f30 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
13f40 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13f50 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
13f60 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
13f70 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
13f80 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
13f90 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
13fa0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
13fb0 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
13fc0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
13fd0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
13fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
13ff0 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
14000 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
14010 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
14020 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
14030 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
14040 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
14050 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
14060 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
14070 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
14080 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
14090 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
140a0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
140b0 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
140c0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
140d0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
140e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
140f0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
14100 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
14110 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
14120 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
14130 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
14140 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
14150 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
14160 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
14170 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
14180 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
14190 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
141a0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
141b0 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
141c0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
141d0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
141e0 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
141f0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
14200 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
14210 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
14220 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
14230 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
14240 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
14250 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
14260 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
14270 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
14280 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
14290 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
142a0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
142b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
142c0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
142d0 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
142e0 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
142f0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
14300 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
14310 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
14320 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
14330 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
14340 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14350 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
14360 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
14370 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
14380 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
14390 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
143a0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
143b0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
143c0 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
143d0 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
143e0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
143f0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
14400 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
14410 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
14420 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
14430 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
14440 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14450 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
14460 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
14470 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
14480 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14490 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
144a0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
144b0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
144c0 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
144d0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
144e0 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
144f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
14500 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
14510 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
14520 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
14530 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
14540 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
14550 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
14560 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
14570 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
14580 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
14590 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
145a0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
145b0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
145c0 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
145d0 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
145e0 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
145f0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
14600 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
14610 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
14620 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
14630 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
14640 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
14650 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14660 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
14670 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
14680 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
14690 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
146a0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
146b0 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
146c0 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
146d0 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
146e0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
146f0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
14700 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
14710 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
14720 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
14730 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
14740 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
14750 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
14760 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
14770 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
14780 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
14790 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
147a0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
147b0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
147c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
147d0 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
147e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
147f0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
14800 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
14810 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
14820 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
14830 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
14840 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
14850 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
14860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
14870 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
14880 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
14890 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
148a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
148b0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
148c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
148d0 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
148e0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
148f0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
14900 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
14910 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
14920 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14930 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
14940 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14950 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
14960 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
14970 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
14980 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
14990 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
149a0 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
149b0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
149c0 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
149d0 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
149e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
149f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14a00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
14a10 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
14a20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
14a30 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
14a40 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
14a50 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
14a60 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
14a70 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
14a80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
14a90 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
14aa0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
14ab0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
14ac0 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
14ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
14ae0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
14af0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
14b00 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
14b10 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
14b20 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
14b30 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
14b40 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
14b50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
14b60 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
14b70 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14b80 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
14b90 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
14ba0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
14bb0 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
14bc0 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
14bd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14be0 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ff;..  /* Begin 
14bf0 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
14c00 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
14c10 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
14c20 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
14c30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
14c40 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
14c50 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
14c60 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
14c70 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
14c80 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
14c90 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14ca0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
14cb0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
14cc0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
14cd0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
14ce0 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
14cf0 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
14d00 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
14d10 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
14d20 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
14d30 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
14d40 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
14d50 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
14d60 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
14d70 74 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  t ){.    iHdrOff
14d80 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
14d90 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
14da0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
14db0 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
14dc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14dd0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
14de0 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
14df0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
14e00 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
14e10 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
14e20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14e30 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
14e40 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
14e50 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
14e60 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
14e70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
14e80 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
14e90 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
14ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
14eb0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
14ec0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
14ed0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
14ee0 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
14ef0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
14f00 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
14f10 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
14f20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
14f30 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
14f40 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
14f50 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
14f60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
14f70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
14f80 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
14f90 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
14fa0 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
14fb0 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
14fc0 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
14fd0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
14fe0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14ff0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
15000 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
15010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15020 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15030 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
15040 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
15050 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
15060 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
15070 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
15080 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
15090 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
150a0 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
150b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
150c0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
150d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
150e0 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
150f0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
15100 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
15110 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
15120 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
15130 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
15140 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
15150 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
15160 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
15170 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
15180 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
15190 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
151a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
151b0 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
151c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
151d0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
151e0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
151f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
15200 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
15210 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
15220 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15230 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
15240 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
15250 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
15260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15270 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
15280 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15290 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
152a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
152b0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
152c0 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70  pPager, 1, 0, &p
152d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
152e0 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
152f0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15300 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
15310 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
15320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
15330 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
15340 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff==szJ );..  
15350 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
15360 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
15370 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
15380 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
15390 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
153a0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
153b0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
153c0 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
153d0 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
153e0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
153f0 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
15400 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
15410 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
15420 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
15430 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
15440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15450 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15460 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
15470 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
15480 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
15490 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f 72  geSize);.    for
154a0 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
154b0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
154c0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
154d0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
154e0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
154f0 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34  t( offset==ii*(4
15500 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
15510 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
15520 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15530 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
15540 20 30 2c 20 30 2c 20 26 6f 66 66 73 65 74 2c 20   0, 0, &offset, 
15550 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d  1, pDone);.    }
15560 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
15570 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
15580 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
15590 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
155a0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
155b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
155c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
155d0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72  f = szJ;.  }.  r
155e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
155f0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
15600 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
15610 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
15620 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
15630 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15640 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
15650 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15660 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
15670 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
15680 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
15690 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
156a0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ge);.}../*.** Ad
156b0 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
156c0 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
156d0 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
156e0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
156f0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
15700 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
15710 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
15720 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
15730 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
15740 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
15750 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
15760 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
15770 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
15780 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
15790 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
157a0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
157b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
157c0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
157d0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
157e0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
157f0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
15800 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
15810 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
15820 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
15830 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
15840 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
15850 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
15860 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
15870 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15880 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
15890 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
158a0 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
158b0 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
158c0 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
158d0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
158e0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
158f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
15910 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
15920 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
15930 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
15940 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
15950 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
15960 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
15970 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
15980 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
15990 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
159a0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
159b0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
159c0 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
159d0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
159e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
159f0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
15a00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15a10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
15a20 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
15a30 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
15a40 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
15a50 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
15a60 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
15a70 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
15a90 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
15aa0 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
15ab0 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
15ac0 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
15ad0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
15ae0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
15af0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
15b00 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
15b10 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
15b20 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
15b30 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
15b40 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
15b50 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
15b60 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
15b70 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
15b80 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
15b90 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
15ba0 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
15bb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15bc0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
15bd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15be0 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
15bf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15c00 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62  int level, int b
15c10 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50  FullFsync){.  pP
15c20 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
15c30 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61  (level==1 || pPa
15c40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
15c50 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
15c60 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c  ullSync = (level
15c70 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
15c80 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
15c90 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
15ca0 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79  lags = (bFullFsy
15cb0 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
15cc0 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
15cd0 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70  NORMAL);.  if( p
15ce0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
15cf0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
15d00 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
15d10 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
15d20 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
15d30 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
15d40 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
15d50 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
15d60 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
15d70 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
15d80 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
15d90 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
15da0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
15db0 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
15dc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
15dd0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
15de0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
15df0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
15e00 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
15e10 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
15e20 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
15e30 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
15e40 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
15e50 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
15e60 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
15e70 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
15e80 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
15e90 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
15ea0 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
15eb0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
15ec0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
15ed0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
15ee0 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
15ef0 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
15f00 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
15f10 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
15f20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
15f30 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
15f40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15f50 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
15f60 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
15f70 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
15f80 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
15f90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
15fa0 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
15fb0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
15fc0 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
15fd0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
15fe0 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
15ff0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
16000 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
16010 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
16020 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
16030 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
16040 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
16050 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
16060 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
16070 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
16080 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
16090 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
160a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
160b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
160c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
160d0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
160e0 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
160f0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
16100 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
16110 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
16120 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
16130 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
16140 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16150 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
16160 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16170 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
16180 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
16190 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
161a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
161b0 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
161c0 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
161d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
161e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
161f0 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
16200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16210 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
16220 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
16230 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
16240 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
16250 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
16260 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
16270 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
16280 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
16290 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
162a0 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
162b0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
162c0 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
162d0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
162e0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
162f0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
16300 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
16310 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
16320 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
16330 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
16340 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
16350 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
16360 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
16370 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
16380 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
16390 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
163a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
163b0 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
163c0 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
163f0 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
16400 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
16410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
16440 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
16450 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
16460 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
16470 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
16480 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
16490 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
164a0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
164b0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
164c0 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
164d0 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
164e0 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
164f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
16500 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
16510 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
16520 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
16530 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
16540 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
16550 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
16560 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
16570 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
16580 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
16590 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
165a0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
165b0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
165c0 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
165d0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165f0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
16600 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
16610 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
16620 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
16630 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
16640 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
16650 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
16660 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
16670 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
16680 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
16690 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
166a0 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75    .  pPager->xBu
166b0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
166c0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
166d0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
166e0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
166f0 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erArg;.}../*.** 
16700 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
16710 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
16720 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16730 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
16740 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
16750 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16760 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
16770 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
16780 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
16790 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
167a0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
167b0 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
167c0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
167d0 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
167e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
167f0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16810 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
16820 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
16830 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
16840 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
16850 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
16860 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
16870 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
16880 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
16890 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
168a0 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
168b0 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
168c0 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
168d0 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
168e0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
168f0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16900 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
16910 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
16920 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
16930 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
16940 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
16950 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
16960 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
16970 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
16980 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
16990 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
169a0 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
169b0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
169c0 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
169d0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
169e0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
169f0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
16a00 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
16a10 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
16a20 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
16a30 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
16a40 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
16a50 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
16a60 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
16a70 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
16a80 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
16a90 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
16aa0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
16ab0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
16ac0 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
16ad0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
16ae0 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
16af0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
16b00 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
16b10 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
16b20 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
16b30 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
16b40 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
16b50 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
16b60 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
16b70 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
16b80 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
16b90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
16ba0 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
16bb0 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
16bc0 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
16bd0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
16be0 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
16bf0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
16c00 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
16c10 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
16c20 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
16c30 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
16c40 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
16c50 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
16c60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16c70 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
16c80 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
16c90 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
16ca0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
16cb0 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
16cc0 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
16cd0 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
16ce0 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
16cf0 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
16d00 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
16d10 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
16d20 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
16d30 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
16d40 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
16d50 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
16d60 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
16d70 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
16d80 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
16d90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
16da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
16db0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
16dc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
16dd0 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  16 *pPageSize, i
16de0 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
16df0 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
16e00 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
16e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16e20 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69  {.    u16 pageSi
16e30 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
16e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
16e50 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
16e60 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
16e70 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
16e80 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
16e90 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
16ea0 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
16eb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
16ec0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
16ed0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
16ee0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
16ef0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 61 67 65  =0 .     && page
16f00 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
16f10 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  !=pPager->pageSi
16f20 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
16f30 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63   char *pNew = (c
16f40 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
16f50 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
16f60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
16f70 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
16f80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
16f90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16fa0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
16fb0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
16fc0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
16fd0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
16fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
16ff0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
17000 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
17010 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
17020 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
17030 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
17040 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
17050 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
17060 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
17070 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50   }.    }.    *pP
17080 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
17090 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
170a0 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
170b0 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
170c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
170d0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
170e0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
170f0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
17100 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
17110 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
17120 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
17130 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
17140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17160 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17170 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
17180 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
17190 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
171a0 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
171b0 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
171c0 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
171d0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
171e0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
171f0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
17200 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
17210 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
17220 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
17230 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
17240 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
17250 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
17260 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
17270 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
17280 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
17290 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
172a0 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
172b0 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
172c0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
172d0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
172e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
172f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
17300 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
17310 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
17320 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
17330 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
17340 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
17350 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
17360 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
17370 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
17380 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
17390 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
173a0 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
173b0 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
173c0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
173d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
173e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
173f0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
17400 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
17410 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
17420 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
17430 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
17440 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
17450 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
17460 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
17470 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
17480 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
17490 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
174a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
174b0 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75  ager, 0);.  retu
174c0 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
174d0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
174e0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
174f0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
17500 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
17510 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
17520 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
17530 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
17540 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
17550 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
17560 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
17570 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
17580 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
17590 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
175a0 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
175b0 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
175c0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
175d0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
175e0 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
175f0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
17600 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
17610 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
17620 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
17630 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
17640 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
17650 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
17660 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
17670 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
17680 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
17690 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
176a0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
176b0 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
176c0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
176d0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
176e0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
176f0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
17700 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
17710 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
17720 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
17730 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
17740 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
17750 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
17760 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
17770 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
17780 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
17790 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
177a0 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
177b0 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
177c0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
177d0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
177e0 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
177f0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
17800 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
17810 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
17820 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
17830 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
17840 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
17850 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
17860 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
17870 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
17880 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
17890 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
178a0 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
178b0 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
178c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
178d0 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
178e0 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
178f0 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
17900 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
17910 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
17920 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
17930 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
17940 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
17950 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
17960 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
17970 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
17980 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
17990 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
179a0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
179b0 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
179c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
179d0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
179e0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
179f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
17a00 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
17a10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
17a20 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
17a30 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
17a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17a50 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
17a60 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
17a70 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
17a80 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
17a90 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69 66  tempFile );.  if
17aa0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
17ab0 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
17ac0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
17ad0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
17ae0 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
17af0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
17b00 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
17b10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
17b20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
17b30 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
17b40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17b70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
17b80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
17b90 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
17ba0 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
17bb0 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67  ed .** with pPag
17bc0 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  er. Normally, th
17bd0 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  is is calculated
17be0 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69   as (<db file si
17bf0 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29  ze>/<page-size>)
17c00 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  ..** However, if
17c10 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
17c20 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
17c30 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
17c40 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
17c50 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
17c60 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
17c70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
17c80 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20  ger is in error 
17c90 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
17ca0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17cb0 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
17cc0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
17cd0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
17ce0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c  ed and *pnPage l
17cf0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f  eft unchanged. O
17d00 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  r,.** if the fil
17d10 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20  e system has to 
17d20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20 74  be queried for t
17d30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
17d40 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71  ile and.** the q
17d50 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65 74  uery attempt ret
17d60 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72  urns an IO error
17d70 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
17d80 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
17d90 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
17da0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
17db0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
17dc0 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
17dd0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
17de0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
17df0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
17e00 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74  d *pnPage is set
17e10 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
17e20 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
17e30 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
17e40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17e50 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
17e60 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
17e70 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e90 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
17ea0 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
17eb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
17ec0 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 69  ger is already i
17ed0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
17ee0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
17ef0 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69  ror code. */.  i
17f00 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
17f10 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
17f20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17f30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
17f40 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
17f50 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
17f60 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69   file. Store thi
17f70 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20  s in nPage. */. 
17f80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
17f90 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  izeValid ){.    
17fa0 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
17fb0 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  dbSize;.  }else{
17fc0 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17fe0 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62  Error returned b
17ff0 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
18000 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  /.    i64 n = 0;
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18020 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
18030 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  tes returned by 
18040 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
18050 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
18060 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18070 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
18080 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
18090 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
180a0 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
180b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
180c0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
180d0 6e 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61  n))) ){.      pa
180e0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
180f0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
18100 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18110 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
18120 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
18130 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
18140 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
18150 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67       nPage = (Pg
18160 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e  no)(n / pPager->
18170 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
18180 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18190 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
181a0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
181b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
181c0 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
181d0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
181e0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50   nPage;.      pP
181f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
18200 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
18210 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
18220 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
18230 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
18240 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
18250 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66  n the .  ** conf
18260 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
18270 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
18280 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
18290 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
182a0 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
182b0 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
182c0 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
182d0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
182e0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
182f0 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
18300 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
18310 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
18320 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
18330 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20  ITE_OK */.  if( 
18340 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  pnPage ){.    *p
18350 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
18360 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18370 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
18380 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
18390 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
183a0 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
183b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
183c0 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
183d0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
183e0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
183f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
18400 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
18410 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
18420 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
18430 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
18440 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
18450 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
18460 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
18470 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
18480 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
18490 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
184a0 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
184b0 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
184c0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
184d0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
184e0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
184f0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
18500 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
18510 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
18520 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18530 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
18540 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
18550 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
18560 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
18570 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
18580 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
18590 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
185a0 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
185b0 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
185c0 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
185d0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
185e0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
185f0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
18600 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
18610 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18640 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
18650 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
18660 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
18670 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
18680 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
18690 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
186a0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
186b0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
186c0 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
186d0 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
186e0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
186f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
18700 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18710 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
18720 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
18730 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
18740 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
18750 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20 2a   unknown. It.  *
18760 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20  * must not have 
18770 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74  been modified at
18780 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
18790 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
187a0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
187b0 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
187c0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d  r->dbSizeValid==
187d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
187e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
187f0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
18800 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
18810 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
18820 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
18830 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
18840 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
18850 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
18860 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
18870 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
18880 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
18890 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
188a0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
188b0 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
188c0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
188d0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
188e0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
188f0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
18900 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18910 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
18920 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
18930 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61   || (pPager->sta
18940 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
18950 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
18960 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
18970 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
18980 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
18990 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70 65  RVED && locktype
189a0 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ==PAGER_EXCLUSIV
189b0 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  E).  );..  if( p
189c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
189d0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
189e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
189f0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
18a00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18a10 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
18a20 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
18a30 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
18a40 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
18a50 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
18a60 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
18a70 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
18a80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18aa0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28  Pager->state = (
18ab0 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  u8)locktype;.   
18ac0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
18ad0 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
18ae0 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
18af0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18b00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
18b10 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
18b20 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
18b30 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
18b40 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
18b50 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
18b60 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
18b70 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
18b80 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
18b90 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
18ba0 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
18bb0 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
18bc0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
18bd0 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
18be0 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
18bf0 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
18c00 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
18c10 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
18c20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
18c30 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
18c40 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
18c50 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
18c60 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
18c70 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
18c80 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
18c90 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
18ca0 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
18cb0 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
18cc0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
18cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
18ce0 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
18cf0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
18d00 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
18d10 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
18d20 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
18d30 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
18d40 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
18d50 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
18d60 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
18d70 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
18d80 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
18d90 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
18da0 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
18db0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
18dc0 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
18dd0 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
18de0 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
18df0 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
18e00 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
18e10 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20  aviour would be 
18e20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
18e30 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
18e40 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
18e50 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
18e60 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
18e70 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
18e80 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
18e90 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
18ea0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
18eb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
18ec0 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
18ed0 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
18ee0 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
18ef0 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
18f00 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
18f10 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
18f20 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
18f30 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
18f40 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
18f50 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
18f60 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
18f70 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
18f80 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
18f90 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
18fa0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
18fb0 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
18fc0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
18fd0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
18fe0 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
18ff0 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
19000 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
19010 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
19020 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
19030 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
19040 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
19050 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
19060 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
19070 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
19080 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
19090 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
190a0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
190b0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
190c0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
190d0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
190e0 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
190f0 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
19100 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
19110 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
19120 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
19130 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
19140 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
19150 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
19160 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
19170 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
19180 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
19190 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
191a0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
191b0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
191c0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
191d0 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
191e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
191f0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  s committed..*/.
19200 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
19210 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
19220 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
19230 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
19240 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
19250 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73  izeValid );.  as
19260 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
19270 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
19280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19290 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
192a0 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67  SERVED );.  pPag
192b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
192c0 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e  ge;.  assertTrun
192d0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
192e0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
192f0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
19300 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
19310 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
19320 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
19330 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
19340 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
19350 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
19360 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19370 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
19380 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
19390 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
193a0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
193b0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
193c0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
193d0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
193e0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
193f0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
19400 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
19410 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
19420 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
19430 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
19440 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
19450 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
19460 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19470 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
19480 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
19490 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
194a0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
194b0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
194c0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
194d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
194e0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
194f0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
19500 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
19510 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
19520 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
19530 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
19540 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
19550 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
19560 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19570 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
19580 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
19590 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
195a0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
195b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
195c0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
195d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
195e0 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
195f0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
19600 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
19610 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
19620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19630 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e   Set Pager.journ
19640 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20  alHdr to -1 for 
19650 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74  the benefit of t
19660 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
19670 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  k() .    ** call
19680 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61   which may be ma
19690 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  de from within p
196a0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
196b0 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20  lback(). If it. 
196c0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c     ** is not -1,
196d0 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63   then the unsync
196e0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e  ed portion of an
196f0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
19700 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65  le may.    ** be
19710 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
19720 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
19730 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
19740 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  re occurs while.
19750 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
19760 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
19770 74 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d  tabase may becom
19780 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
19790 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  /.    pPager->jo
197a0 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20  urnalHdr = -1;. 
197b0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
197c0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
197d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
197e0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
197f0 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
19800 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
19810 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
19820 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
19830 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
19840 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
19850 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
19860 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
19870 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
19880 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
19890 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
198a0 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
198b0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
198c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
198d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
198e0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
198f0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
19900 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
19910 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
19920 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
19930 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
19940 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
19950 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
19960 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
19970 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
19980 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
19990 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
199a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
199b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
199c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
199d0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
199e0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
199f0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
19a00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19a10 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
19a20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
19a30 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
19a40 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
19a50 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
19a60 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
19a70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
19a80 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
19a90 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
19aa0 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
19ab0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
19ac0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
19ad0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
19ae0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
19af0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
19b00 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19b10 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
19b20 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
19b30 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
19b40 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
19b50 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
19b60 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
19b70 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
19b80 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
19b90 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
19ba0 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
19bb0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
19bc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
19bd0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
19be0 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e  is not set, then
19bf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19c00 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74  s a.** no-op. Ot
19c10 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
19c20 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
19c30 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
19c40 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20  nal-mode.** and 
19c50 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
19c60 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
19c70 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
19c80 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
19c90 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
19ca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19cb0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
19cc0 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
19cd0 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
19ce0 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
19cf0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
19d00 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
19d10 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
19d20 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
19d30 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
19d40 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
19d50 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
19d60 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
19d70 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
19d80 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
19d90 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
19da0 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
19db0 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
19dc0 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
19dd0 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
19de0 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
19df0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
19e00 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
19e10 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
19e20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19e30 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
19e40 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
19e50 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
19e60 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
19e70 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
19e80 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
19e90 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
19ea0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
19eb0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
19ec0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
19ed0 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
19ee0 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
19ef0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
19f00 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
19f10 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
19f20 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
19f30 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
19f40 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
19f50 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
19f60 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
19f70 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
19f80 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
19f90 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
19fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
19fb0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65  **   }.**.** The
19fc0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
19fd0 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62 65  flag is never be
19fe0 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72 61   set for tempora
19ff0 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79  ry files, or any
1a000 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74 69  .** file operati
1a010 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1a020 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63  de (Pager.noSync
1a030 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f   set to non-zero
1a040 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  )..**.** If succ
1a050 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
1a060 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
1a070 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1a080 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
1a090 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
1a0a0 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
1a0b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1a0c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
1a0d0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
1a0e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1a0f0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1a100 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a110 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1a120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
1a130 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
1a140 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a150 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1a160 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a170 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1a180 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
1a190 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1a1a0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1a1b0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
1a1c0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a1f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20  rn code */.     
1a200 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
1a210 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1a220 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1a230 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1a240 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1a250 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1a260 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
1a270 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1a280 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
1a290 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1a2a0 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
1a2b0 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
1a2c0 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
1a2d0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
1a2e0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
1a2f0 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
1a300 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
1a310 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
1a320 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
1a330 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
1a340 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a350 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
1a360 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
1a370 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
1a380 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
1a390 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
1a3a0 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
1a3b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
1a3c0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
1a3d0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
1a3e0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
1a3f0 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
1a400 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1a410 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
1a420 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  ions transaction
1a430 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
1a440 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
1a450 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
1a460 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
1a470 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
1a480 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
1a490 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
1a4a0 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
1a4b0 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
1a4c0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
1a4d0 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
1a4e0 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
1a4f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
1a500 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
1a510 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
1a520 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
1a530 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
1a540 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
1a550 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
1a560 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
1a570 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
1a580 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
1a590 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
1a5a0 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
1a5b0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
1a5c0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
1a5d0 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
1a5e0 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
1a5f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1a600 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
1a610 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
1a620 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
1a630 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a640 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
1a650 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
1a660 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
1a670 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
1a680 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
1a690 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
1a6a0 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
1a6b0 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
1a6c0 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
1a6d0 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
1a6e0 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
1a6f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1a700 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
1a710 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
1a720 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
1a730 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
1a740 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
1a750 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
1a760 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
1a770 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
1a780 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
1a790 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
1a7a0 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
1a7b0 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
1a7c0 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
1a7d0 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
1a7e0 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
1a7f0 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
1a800 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
1a810 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
1a820 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
1a830 3b 0a 09 75 38 20 7a 48 65 61 64 65 72 5b 73 69  ;..u8 zHeader[si
1a840 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1a850 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d 63 70 79  ic)+4];...memcpy
1a860 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
1a870 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
1a880 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
1a890 0a 09 70 75 74 33 32 62 69 74 73 28 26 7a 48 65  ..put32bits(&zHe
1a8a0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
1a8b0 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
1a8c0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
1a8d0 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
1a8e0 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
1a8f0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
1a900 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a910 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1a920 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
1a930 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
1a940 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1a950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a960 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
1a970 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
1a980 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
1a990 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1a9a0 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
1a9b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a9c0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a9d0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
1a9e0 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
1a9f0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1aa00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1aa10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1aa20 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1aa30 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1aa40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1aa50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
1aa60 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1aa70 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1aa80 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1aa90 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
1aaa0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
1aab0 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
1aac0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
1aad0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
1aae0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
1aaf0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
1ab00 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
1ab10 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
1ab20 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
1ab30 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
1ab40 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
1ab50 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
1ab60 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1ab70 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
1ab80 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1ab90 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
1aba0 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
1abb0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
1abc0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
1abd0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
1abe0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1abf0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
1ac00 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
1ac10 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
1ac20 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
1ac30 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
1ac40 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
1ac50 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
1ac60 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
1ac70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ac80 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1ac90 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
1aca0 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
1acb0 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
1acc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1acd0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1ace0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1acf0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1ad00 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
1ad10 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1ad20 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1ad30 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1ad40 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1ad50 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1ad60 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1ad70 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
1ad80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1ad90 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1ada0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1adb0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
1adc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1add0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ade0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1adf0 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
1ae00 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
1ae10 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
1ae20 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
1ae30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1ae40 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
1ae50 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
1ae60 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1ae70 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
1ae80 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09 29 3b 0a  >journalHdr..);.
1ae90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1aea0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1aeb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1aec0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1aed0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
1aee0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
1aef0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1af00 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1af10 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1af20 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1af30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1af40 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1af50 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
1af60 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1af70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1af80 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20  er->sync_flags| 
1af90 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
1afa0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d  er->sync_flags==
1afb0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1afc0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
1afd0 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
1afe0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1aff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b010 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1b020 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b030 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63 65  e was just succe
1b040 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
1b050 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53 79  Set Pager.needSy
1b060 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65  nc .    ** to ze
1b070 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  ro and clear the
1b080 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1b090 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67   flag on all pag
1b0a0 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ess..    */.    
1b0b0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b0c0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b0d0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1b0e0 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1b0f0 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1b100 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1b110 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1b120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1b140 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1b150 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1b160 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1b170 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1b180 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1b190 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1b1a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1b1b0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1b1c0 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1b1d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1b1e0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1b1f0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1b200 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1b210 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1b220 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1b230 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1b240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1b250 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1b260 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1b270 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1b280 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1b290 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1b2a0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1b2b0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1b2c0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1b2d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1b2e0 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1b2f0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1b300 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1b310 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1b320 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1b330 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1b340 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1b350 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1b360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b370 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1b380 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1b390 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1b3a0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1b3b0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1b3c0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1b3d0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1b3e0 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1b3f0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1b400 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1b410 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1b420 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
1b430 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
1b440 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
1b450 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
1b460 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1b470 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1b480 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
1b490 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
1b4a0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
1b4b0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
1b4c0 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
1b4d0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
1b4e0 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
1b4f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1b500 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
1b510 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
1b520 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
1b530 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
1b540 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
1b550 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
1b560 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
1b570 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
1b580 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1b590 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
1b5a0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
1b5b0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
1b5c0 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
1b5d0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
1b5e0 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
1b5f0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
1b600 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
1b610 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
1b620 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
1b630 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
1b640 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1b650 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1b660 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1b670 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1b680 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1b690 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
1b6a0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1b6b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
1b6c0 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
1b6d0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
1b6e0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
1b6f0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1b700 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1b710 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
1b720 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
1b730 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
1b740 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b760 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1b770 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b7a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
1b7b0 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30  ( NEVER(pList==0
1b7c0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1b7d0 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
1b7e0 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
1b7f0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
1b800 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
1b810 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
1b820 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1b830 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
1b840 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b850 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
1b860 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
1b870 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
1b880 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69  wing.  ** call i
1b890 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
1b8a0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
1b8b0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
1b8c0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
1b8d0 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
1b8e0 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
1b8f0 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
1b900 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
1b910 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
1b920 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
1b930 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
1b940 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
1b950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
1b960 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
1b970 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
1b980 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
1b990 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
1b9a0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
1b9b0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
1b9c0 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
1b9d0 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
1b9e0 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
1b9f0 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
1ba00 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
1ba10 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
1ba20 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
1ba30 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
1ba40 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
1ba50 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
1ba60 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
1ba70 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1ba80 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
1ba90 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
1baa0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1bab0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
1bac0 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
1bad0 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
1bae0 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
1baf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bb00 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
1bb10 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
1bb20 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
1bb30 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1bb40 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
1bb50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bb60 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1bb70 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63 20  ESERVED );.  rc 
1bb80 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1bb90 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
1bba0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20  LUSIVE_LOCK);.. 
1bbb0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1bbc0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
1bbd0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
1bbe0 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
1bbf0 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
1bc00 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
1bc10 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
1bc20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
1bc30 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
1bc40 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
1bc50 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1bc60 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1bc70 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
1bc80 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
1bc90 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1bca0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1bcb0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
1bcc0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1bcd0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1bce0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
1bcf0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
1bd00 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
1bd10 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
1bd20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bd30 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
1bd40 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
1bd50 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
1bd60 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
1bd70 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
1bd80 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
1bd90 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1bda0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
1bdb0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
1bdc0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
1bdd0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1bde0 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
1bdf0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
1be00 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
1be10 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
1be20 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
1be30 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
1be40 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
1be50 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
1be60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1be70 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
1be80 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
1be90 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
1bea0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
1beb0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
1bec0 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
1bed0 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
1bee0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
1bef0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
1bf00 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
1bf10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
1bf20 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
1bf30 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
1bf40 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1bf50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
1bf60 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
1bf70 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
1bf80 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1bfb0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
1bfc0 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e     ..      /* En
1bfd0 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
1bfe0 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
1bff0 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
1c000 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
1c010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1c020 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20  OMEM, pData);.. 
1c030 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
1c040 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
1c050 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1c060 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1c070 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
1c080 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c090 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
1c0a0 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
1c0b0 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
1c0c0 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
1c0d0 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
1c0e0 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
1c0f0 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
1c100 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c110 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
1c120 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
1c130 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
1c140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1c150 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
1c160 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
1c170 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1c180 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
1c190 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1c1a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
1c1b0 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
1c1c0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1c1d0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
1c1e0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
1c1f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1c200 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1c210 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1c220 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a   pgno;.      }..
1c230 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1c240 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
1c250 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
1c260 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
1c270 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
1c280 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1c290 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1c2a0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
1c2b0 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
1c2c0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c2d0 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
1c2e0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1c2f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c300 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1c310 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
1c320 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
1c330 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
1c340 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
1c350 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1c360 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
1c370 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1c380 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
1c390 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
1c3a0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
1c3b0 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rite);.    }else
1c3c0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
1c3d0 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
1c3e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1c3f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1c400 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  o));.    }.#ifde
1c410 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1c420 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
1c430 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1c440 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1c450 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
1c460 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
1c470 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
1c480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1c490 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
1c4a0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
1c4b0 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
1c4c0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1c4d0 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
1c4e0 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
1c4f0 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
1c500 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1c510 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
1c520 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
1c530 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
1c540 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1c550 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1c560 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
1c570 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
1c580 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
1c590 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
1c5a0 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
1c5b0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
1c5c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1c5d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1c5e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
1c5f0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1c600 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
1c610 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
1c620 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
1c630 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1c640 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1c650 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
1c660 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
1c670 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
1c680 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
1c690 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
1c6a0 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
1c6b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
1c6c0 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
1c6d0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
1c6e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c6f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1c700 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1c710 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1c720 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76  ->sjfd) ){.    v
1c730 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
1c740 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34  ->pData;.    i64
1c750 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
1c760 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
1c770 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c780 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1c790 3b 0a 0a 20 20 20 20 43 4f 44 45 43 32 28 70 50  ;..    CODEC2(pP
1c7a0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1c7b0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
1c7c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
1c7d0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 50 41 47  pData2);.    PAG
1c7e0 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
1c7f0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1c800 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c810 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1c820 29 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72  ));.  .    asser
1c830 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
1c840 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
1c850 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
1c860 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20  gSize );.    rc 
1c870 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1c880 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
1c890 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
1c8a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c8b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c8c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1c8d0 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
1c8e0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1c8f0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1c900 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t+4);.    }.  }.
1c910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c920 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
1c930 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20  r->nSubRec++;.  
1c940 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c950 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
1c960 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f  ;.    rc = addTo
1c970 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
1c980 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
1c990 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
1c9a0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c9b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c9c0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
1c9d0 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
1c9e0 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
1c9f0 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
1ca00 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
1ca10 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1ca20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1ca30 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
1ca40 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
1ca50 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
1ca60 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
1ca70 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
1ca80 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
1ca90 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
1caa0 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
1cab0 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
1cac0 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
1cad0 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
1cae0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1caf0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
1cb00 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
1cb10 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
1cb20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
1cb30 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
1cb40 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
1cb50 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
1cb60 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
1cb70 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
1cb80 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
1cb90 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
1cba0 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
1cbb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1cbc0 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
1cbd0 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
1cbe0 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
1cbf0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
1cc00 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1cc10 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
1cc20 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
1cc30 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
1cc40 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1cc50 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
1cc60 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1cc70 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
1cc80 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
1cc90 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
1cca0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ccb0 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
1ccc0 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
1ccd0 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
1cce0 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
1ccf0 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
1cd00 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
1cd10 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1cd20 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1cd30 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1cd40 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
1cd50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cd60 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
1cd70 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
1cd80 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1cd90 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
1cda0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cdb0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1cdc0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
1cdd0 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
1cde0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
1cdf0 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
1ce00 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20  * The doNotSync 
1ce10 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74  flag is set by t
1ce20 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  he sqlite3PagerW
1ce30 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  rite() function 
1ce40 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73  while it.  ** is
1ce50 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73   journalling a s
1ce60 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  et of two or mor
1ce70 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  e database pages
1ce80 20 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64   that are stored
1ce90 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d  .  ** on the sam
1cea0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
1ceb0 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  yncing the journ
1cec0 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  al is not allowe
1ced0 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69  d while.  ** thi
1cee0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  s is happening a
1cef0 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  s it is importan
1cf00 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65  t that all membe
1cf10 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20 2a  rs of such a.  *
1cf20 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 61  * set of pages a
1cf30 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  re synced to dis
1cf40 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20  k together. So, 
1cf50 69 66 20 74 68 65 20 70 61 67 65 20 74 68 69 73  if the page this
1cf60 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
1cf70 73 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  s trying to make
1cf80 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75   clean will requ
1cf90 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ire a journal sy
1cfa0 6e 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74  nc and the doNot
1cfb0 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69  Sync.  ** flag i
1cfc0 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69  s set, return wi
1cfd0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1cfe0 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65  hing. The pcache
1cff0 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a   layer will.  **
1d000 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f   just have to go
1d010 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63   ahead and alloc
1d020 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62  ate a new page b
1d030 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66  uffer instead of
1d040 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50  .  ** reusing pP
1d050 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d  g..  **.  ** Sim
1d060 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70  ilarly, if the p
1d070 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
1d080 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
1d090 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
1d0a0 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69  .  ** try to wri
1d0b0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
1d0c0 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a  of pPg to disk..
1d0d0 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
1d0e0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
1d0f0 29 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d  ).   || (pPager-
1d100 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1d110 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d120 45 45 44 5f 53 59 4e 43 29 0a 20 20 29 7b 0a 20  EED_SYNC).  ){. 
1d130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d140 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  _OK;.  }..  /* S
1d150 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1d160 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
1d170 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  . */.  if( pPg->
1d180 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1d190 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20  _SYNC ){.    rc 
1d1a0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1d1b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1d1c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d1d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1d1e0 20 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61   && .      !(pPa
1d1f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1d200 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
1d210 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
1d220 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73       !(sqlite3Os
1d230 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1d240 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1d250 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
1d260 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20  AFE_APPEND).    
1d270 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1d280 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
1d290 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1d2a0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
1d2b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1d2c0 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
1d2d0 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
1d2e0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
1d2f0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1d300 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
1d310 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
1d320 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
1d330 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
1d340 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68  journal..  ** Th
1d350 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
1d360 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
1d370 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
1d380 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
1d390 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
1d3a0 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
1d3b0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
1d3c0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e  e..  **.  ** Con
1d3d0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1d3e0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
1d3f0 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a  events:.  **.  *
1d400 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20  *   BEGIN;.  ** 
1d410 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
1d420 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d  e X>.  **     <m
1d430 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
1d440 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
1d450 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20   sp;.  **       
1d460 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
1d470 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
1d480 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67  >.  **       pag
1d490 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
1d4a0 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41  .  **     ROLLBA
1d4b0 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20  CK TO sp;.  **. 
1d4c0 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
1d4d0 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
1d4e0 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
1d4f0 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
1d500 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75   written.  ** ou
1d510 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1d520 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
1d530 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
1d540 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
1d550 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ,.  ** following
1d560 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
1d570 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
1d580 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
1d590 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64  will read.  ** d
1d5a0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
1d5b0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
1d5c0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
1d5d0 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
1d5e0 74 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20  t.  ** was when 
1d5f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d600 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
1d610 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
1d620 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20  EPOINT sp".  ** 
1d630 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
1d640 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  **.  ** The solu
1d650 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
1d660 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
1d670 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
1d680 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d  o the .  ** sub-
1d690 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
1d6a0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1d6b0 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
1d6c0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
1d6d0 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
1d6e0 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
1d6f0 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
1d700 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
1d710 73 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64  s .  ** executed
1d720 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
1d730 45 52 28 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ER(.      rc==SQ
1d740 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
1d750 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
1d760 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
1d770 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 29  resPage(pPg).  )
1d780 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62   ){.    rc = sub
1d790 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
1d7a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1d7b0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1d7c0 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
1d7d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d7e0 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ile. */.  if( rc
1d7f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d800 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
1d810 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
1d820 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1d830 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
1d840 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
1d850 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
1d860 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d870 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
1d880 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
1d890 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1d8a0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1d8b0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
1d8c0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1d8d0 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
1d8e0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d8f0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d900 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
1d910 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
1d920 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
1d930 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
1d940 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
1d950 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
1d960 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
1d970 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
1d980 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
1d990 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1d9a0 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
1d9b0 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1d9c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1d9d0 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
1d9e0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
1d9f0 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
1da00 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
1da10 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
1da20 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1da30 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
1da40 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
1da50 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
1da60 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
1da70 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
1da80 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1da90 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
1daa0 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
1dab0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
1dac0 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
1dad0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
1dae0 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
1daf0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
1db00 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
1db10 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
1db20 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
1db30 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1db40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
1db50 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
1db60 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
1db70 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
1db80 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
1db90 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
1dba0 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
1dbb0 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
1dbc0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
1dbd0 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
1dbe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1dbf0 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
1dc00 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
1dc10 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
1dc20 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
1dc30 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
1dc40 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
1dc50 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
1dc60 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
1dc70 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
1dc80 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
1dc90 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
1dca0 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
1dcb0 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
1dcc0 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
1dcd0 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
1dce0 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
1dcf0 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
1dd00 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
1dd10 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
1dd20 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
1dd30 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
1dd40 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
1dd50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1dd60 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
1dd70 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
1dd80 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
1dd90 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
1dda0 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
1ddb0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
1ddc0 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
1ddd0 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
1dde0 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
1ddf0 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
1de00 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
1de10 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1de20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
1de30 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
1de40 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
1de50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1de60 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
1de70 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
1de80 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
1de90 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
1dea0 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
1deb0 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
1dec0 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
1ded0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
1dee0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1def0 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
1df00 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
1df10 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
1df20 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
1df30 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
1df40 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
1df50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
1df60 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1df70 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1df80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1df90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1dfa0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1dfb0 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
1dfc0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
1dfd0 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
1dfe0 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
1dff0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1e000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e010 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
1e020 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
1e030 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
1e040 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1e050 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
1e060 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
1e070 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
1e080 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
1e090 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
1e0a0 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
1e0b0 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
1e0c0 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
1e0d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e0e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
1e0f0 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
1e100 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
1e110 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1e120 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
1e130 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e140 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
1e150 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e160 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
1e170 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
1e180 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
1e190 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
1e1a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e1b0 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
1e1c0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1e1d0 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
1e1e0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e1f0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1e200 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
1e210 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
1e220 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
1e230 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
1e240 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
1e250 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
1e260 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
1e270 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
1e280 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
1e290 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
1e2a0 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
1e2b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1e2c0 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
1e2d0 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
1e2e0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
1e2f0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
1e300 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
1e310 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
1e320 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
1e330 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
1e340 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
1e350 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
1e360 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
1e370 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
1e380 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
1e390 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
1e3a0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e3b0 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
1e3c0 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67  e */.  u16 szPag
1e3d0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
1e3e0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1e3f0 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
1e400 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
1e410 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1e420 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
1e430 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
1e440 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
1e450 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
1e460 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
1e470 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1e480 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
1e490 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
1e4a0 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
1e4b0 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
1e4c0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
1e4d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1e4e0 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
1e4f0 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
1e500 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
1e510 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
1e520 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
1e530 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
1e540 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
1e550 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
1e560 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
1e570 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
1e580 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
1e590 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
1e5a0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1e5b0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
1e5c0 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
1e5d0 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
1e5e0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1e5f0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
1e600 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
1e610 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
1e620 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1e630 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
1e640 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
1e650 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
1e660 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1e670 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
1e680 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
1e690 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
1e6a0 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
1e6b0 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
1e6c0 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
1e6d0 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
1e6e0 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
1e6f0 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
1e700 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
1e710 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
1e720 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
1e730 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
1e740 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
1e750 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
1e760 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
1e770 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
1e780 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
1e790 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
1e7a0 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
1e7b0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1e7c0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1e7d0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
1e7e0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
1e7f0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
1e800 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
1e810 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
1e820 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
1e830 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
1e840 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e850 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1e860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e870 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
1e880 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
1e890 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
1e8a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
1e8b0 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
1e8c0 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
1e8d0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
1e8e0 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
1e8f0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
1e900 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
1e910 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
1e920 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
1e930 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
1e940 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
1e950 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
1e960 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
1e970 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
1e980 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50  );.    }..    nP
1e990 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1e9a0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
1e9b0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1e9c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
1e9d0 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
1e9e0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
1e9f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
1ea00 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
1ea10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
1ea20 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
1ea30 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
1ea40 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
1ea50 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
1ea60 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
1ea70 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
1ea80 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
1ea90 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
1eaa0 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
1eab0 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
1eac0 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
1ead0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
1eae0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1eaf0 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
1eb00 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
1eb10 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
1eb20 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
1eb30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1eb40 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
1eb50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
1eb60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1eb70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1eb80 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
1eb90 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
1eba0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ebb0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
1ebc0 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
1ebd0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
1ebe0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
1ebf0 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
1ec00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
1ec10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ec20 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1ec30 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
1ec40 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
1ec50 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
1ec60 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1ec70 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
1ec80 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1ec90 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
1eca0 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
1ecb0 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
1ecc0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1ecd0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1ece0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
1ecf0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
1ed00 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
1ed10 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
1ed20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
1ed30 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
1ed40 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
1ed50 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
1ed60 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1ed70 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1ed80 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
1ed90 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
1eda0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1edb0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1edc0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
1edd0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
1ede0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
1edf0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
1ee00 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
1ee20 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
1ee30 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
1ee40 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
1ee50 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
1ee60 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
1ee70 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
1ee80 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1ee90 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1eea0 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
1eeb0 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
1eec0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
1eed0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
1eee0 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
1eef0 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
1ef00 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
1ef10 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
1ef20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1ef30 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
1ef40 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
1ef50 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
1ef60 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
1ef70 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
1ef80 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
1ef90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
1efa0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20  ournal */.  );. 
1efb0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1efc0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
1efd0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
1efe0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
1eff0 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
1f000 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1f010 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
1f020 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f030 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
1f040 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
1f050 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
1f060 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
1f070 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
1f080 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  ache*)(pPtr += R
1f090 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
1f0a0 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65  ager)));.  pPage
1f0b0 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
1f0c0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f0d0 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53  = ROUND8(pcacheS
1f0e0 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ize));.  pPager-
1f0f0 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
1f100 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
1f110 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
1f120 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65  sFile));.  pPage
1f130 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
1f140 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f150 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
1f160 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
1f170 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
1f180 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
1f190 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
1f1a0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1f1b0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50  YTE_ALIGNMENT(pP
1f1c0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
1f1d0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
1f1e0 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20  Pager.zFilename 
1f1f0 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
1f200 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72  al buffers, if r
1f210 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
1f220 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
1f230 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
1f240 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
1f250 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
1f260 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63  e + 1);.    memc
1f270 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
1f280 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
1f290 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
1f2a0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
1f2b0 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
1f2c0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
1f2d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
1f2e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
1f2f0 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
1f300 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69 66  nal", 8);.    if
1f310 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  ( pPager->zFilen
1f320 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61 67  ame[0]==0 ) pPag
1f330 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20  er->zJournal[0] 
1f340 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
1f350 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1f360 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1f370 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
1f380 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
1f390 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
1f3a0 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
1f3b0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
1f3c0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
1f3d0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
1f3e0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
1f3f0 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f410 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
1f420 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
1f430 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1f440 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
1f450 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f460 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
1f470 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
1f480 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
1f490 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
1f4a0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
1f4b0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1f4c0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1f4d0 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
1f4e0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
1f4f0 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
1f500 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1f510 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
1f520 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
1f530 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1f540 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
1f550 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
1f560 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
1f570 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
1f580 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1f590 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
1f5a0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
1f5b0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1f5c0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1f5d0 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
1f5e0 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
1f5f0 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
1f600 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
1f610 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
1f620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f630 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
1f640 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
1f650 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1f660 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1f670 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
1f680 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
1f690 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f6a0 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
1f6b0 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
1f6c0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
1f6d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1f6e0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
1f6f0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f700 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
1f710 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1f720 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
1f730 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f740 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
1f750 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
1f760 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70  ageDflt = (u16)p
1f770 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1f780 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1f790 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1f7a0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1f7b0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
1f7c0 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
1f7d0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1f7e0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1f7f0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1f800 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1f810 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1f820 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1f830 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
1f840 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
1f850 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f860 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
1f870 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1f880 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
1f890 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
1f8a0 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
1f8b0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
1f8c0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
1f8d0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1f8e0 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
1f8f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
1f900 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
1f910 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
1f920 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
1f930 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
1f940 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f950 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
1f960 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
1f970 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
1f980 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1f990 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
1f9a0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
1f9b0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
1f9c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
1f9d0 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
1f9e0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
1f9f0 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
1fa00 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
1fa10 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
1fa20 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
1fa30 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
1fa40 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
1fa50 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
1fa60 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
1fa70 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
1fa80 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
1fa90 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
1faa0 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
1fab0 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
1fac0 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
1fad0 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
1fae0 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
1faf0 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
1fb00 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
1fb10 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
1fb20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1fb30 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
1fb40 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  IVE;.    readOnl
1fb50 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
1fb60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1fb70 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
1fb80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
1fb90 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
1fba0 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
1fbb0 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
1fbc0 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
1fbd0 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
1fbe0 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
1fbf0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
1fc00 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
1fc10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fc20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1fc30 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
1fc40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fc50 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1fc60 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
1fc70 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
1fc80 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1fc90 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
1fca0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
1fcb0 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68  occurred in eith
1fcc0 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
1fcd0 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
1fce0 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72   .  ** Pager str
1fcf0 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
1fd00 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
1fd10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fd20 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1fd30 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  t( !pPager->pTmp
1fd40 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c  Space );.    sql
1fd50 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
1fd60 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
1fd70 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
1fd80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1fd90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
1fda0 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
1fdb0 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61  e object. */.  a
1fdc0 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
1fdd0 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d  00 );.  nExtra =
1fde0 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
1fdf0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1fe00 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
1fe10 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
1fe20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe30 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
1fe40 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
1fe50 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
1fe60 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
1fe70 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
1fe80 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
1fe90 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
1fea0 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
1feb0 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
1fec0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
1fed0 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
1fee0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
1fef0 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
1ff00 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
1ff10 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
1ff20 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
1ff30 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20   (noReadlock && 
1ff40 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a  readOnly) ?1:0;.
1ff50 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
1ff60 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
1ff70 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
1ff80 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
1ff90 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
1ffa0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
1ffb0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28  >dbSizeValid = (
1ffc0 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70  u8)memDb;.  /* p
1ffd0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1ffe0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
1fff0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
20000 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20010 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
20020 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
20030 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
20040 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
20050 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
20060 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
20070 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
20080 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
20090 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
200a0 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
200b0 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a  _UNLOCK) );.  /*
200c0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
200d0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
200e0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
200f0 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
20100 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
20110 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
20120 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
20130 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
20140 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
20150 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
20160 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
20170 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
20180 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
20190 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
201a0 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
201b0 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
201c0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
201d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
201e0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
201f0 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
20200 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
20210 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
20220 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
20230 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
20240 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
20250 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
20260 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
20270 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
20280 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20290 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
202a0 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  Sync = pPager->n
202b0 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50  oSync ?0:1;.  pP
202c0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
202d0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
202e0 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67  ORMAL;.  /* pPag
202f0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
20300 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
20310 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
20320 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20330 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
20340 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
20350 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
20360 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20370 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
20380 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
20390 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
203a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
203b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
203c0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
203d0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
203e0 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
203f0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
20400 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
20410 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
20420 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
20430 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
20440 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
20450 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
20460 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
20470 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
20480 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
20490 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
204a0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
204b0 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
204c0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
204d0 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
204e0 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
204f0 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
20500 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
20510 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  )); */..  *ppPag
20520 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
20530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20540 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .}..../*.** This
20550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20560 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
20570 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
20580 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
20590 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
205a0 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
205b0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
205c0 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
205d0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
205e0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
205f0 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
20600 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
20610 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
20620 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
20630 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
20640 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
20650 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
20660 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
20670 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
20680 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
20690 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
206a0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
206b0 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
206c0 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
206d0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
206e0 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
206f0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
20700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
20710 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
20720 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
20730 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
20740 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
20750 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
20760 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
20770 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
20780 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
20790 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
207a0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
207b0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
207c0 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
207d0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
207e0 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
207f0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
20800 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
20810 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
20820 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
20830 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
20840 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
20850 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20860 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
20870 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
20880 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
20890 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
208a0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
208b0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
208c0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
208d0 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
208e0 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
208f0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
20900 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
20910 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
20920 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
20930 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20940 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
20950 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
20960 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
20970 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
20980 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
20990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
209a0 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
209b0 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
209c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
209d0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
209e0 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
209f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20a00 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
20a10 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
20a20 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
20a30 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
20a40 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
20a50 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
20a60 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
20a70 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
20a80 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
20a90 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
20aa0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
20ab0 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
20ac0 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
20ad0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
20ae0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
20af0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
20b00 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
20b10 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
20b20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
20b30 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
20b40 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
20b50 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
20b60 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
20b70 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
20b80 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
20b90 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
20ba0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
20bb0 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
20bc0 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
20bd0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
20be0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
20bf0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
20c20 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 20  /.  int exists; 
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
20c50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
20c60 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  resent */..  ass
20c70 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
20c80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20c90 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
20ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
20cb0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
20cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
20cd0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
20ce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20cf0 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50  ager->state <= P
20d00 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
20d10 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
20d20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20d30 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
20d40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
20d50 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20d60 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
20d70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20d80 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
20d90 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20      int locked; 
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
20dc0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
20dd0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
20de0 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
20df0 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
20e00 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
20e10 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
20e20 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
20e30 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
20e40 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
20e50 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
20e60 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
20e70 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
20e80 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
20e90 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
20ea0 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
20eb0 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
20ec0 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
20ed0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
20ee0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
20ef0 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
20f00 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
20f10 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
20f20 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
20f30 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
20f40 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
20f50 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
20f60 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
20f70 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
20f80 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
20f90 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
20fa0 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
20fb0 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
20fc0 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
20fd0 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
20fe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20ff0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
21000 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
21010 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
21020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21030 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
21040 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a       int nPage;.
21050 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
21060 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
21070 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
21080 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  f it consists of
21090 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20   0 pages,.      
210a0 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ** then delete t
210b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
210c0 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
210d0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f  comment above fo
210e0 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  r .      ** the 
210f0 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20  reasoning here. 
21100 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f   Delete the obso
21110 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
21120 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a  e under.      **
21130 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
21140 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63   to avoid race c
21150 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f  onditions and to
21160 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67   avoid violating
21170 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32  .      ** [H3302
21180 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  0]..      */.   
21190 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
211a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
211b0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
211c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
211d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
211e0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
211f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21200 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
21210 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
21220 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 4c    if( sqlite3OsL
21230 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
21240 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
21250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21270 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
21280 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
21290 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
212a0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
212b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
212c0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
212d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
212e0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
212f0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
21300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21310 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
21320 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
21330 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
21340 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
21350 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
21360 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
21370 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
21380 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
21390 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
213a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
213b0 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
213c0 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
213d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
213e0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
213f0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
21400 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
21410 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
21420 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
21430 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
21440 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
21450 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
21460 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
21470 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
21480 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
21490 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
214a0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
214b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
214c0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
214d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
214e0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
214f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21510 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69             u8 fi
21520 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rst = 0;.       
21530 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21540 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
21550 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69  jfd, (void *)&fi
21560 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  rst, 1, 0);.    
21570 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
21580 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
21590 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
215a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
215b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
215c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
215d0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
215e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
215f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
21600 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
21610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
21620 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
21630 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
21640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
21650 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
21660 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
21670 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
21680 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
21690 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68          ** its h
216a0 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
216b0 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
216c0 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
216d0 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
216e0 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
216f0 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
21700 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
21710 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
21720 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
21730 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
21740 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
21750 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
21760 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
21770 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
21780 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
21790 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
217a0 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
217b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
217c0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
217d0 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
217e0 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
217f0 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
21800 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
21810 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
21820 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
21830 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
21840 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
21850 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
21860 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
21870 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
21880 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21890 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
218a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
218b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
218c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
218d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
218e0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
218f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
21900 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
21910 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
21920 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21930 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
21940 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
21950 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
21960 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
21970 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
21980 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
21990 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
219a0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
219b0 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
219c0 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
219d0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
219e0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
219f0 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
21a00 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
21a10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
21a20 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
21a30 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
21a40 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
21a50 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
21a60 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
21a70 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
21a80 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
21a90 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
21aa0 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
21ab0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
21ac0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
21ad0 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63  ; /* Pager objec
21ae0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
21af0 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20  h page pPg */.  
21b00 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
21b10 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  >pgno;       /* 
21b20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72  Page number to r
21b30 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ead */.  int rc;
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
21b60 63 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f  code */.  i64 iO
21b70 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
21b80 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
21b90 66 66 73 65 74 20 6f 66 20 66 69 6c 65 20 74 6f  ffset of file to
21ba0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20   read from */.. 
21bb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21bc0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
21bd0 41 52 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29  ARED && !MEMDB )
21be0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
21bf0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
21c00 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  ;..  if( NEVER(!
21c10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
21c20 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  d)) ){.    asser
21c30 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
21c40 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
21c50 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
21c60 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21c70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
21c80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21c90 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
21ca0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
21cb0 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d  pageSize;.  rc =
21cc0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
21cd0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
21ce0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
21cf0 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74  ageSize, iOffset
21d00 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21d10 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
21d20 52 45 41 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  READ ){.    rc =
21d30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21d40 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
21d50 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
21d60 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
21d70 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
21d80 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
21d90 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
21da0 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
21db0 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
21dc0 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
21dd0 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
21de0 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
21df0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
21e00 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
21e10 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
21e20 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
21e30 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
21e40 2a 2a 20 7a 65 72 6f 2e 20 20 42 79 74 65 73 20  ** zero.  Bytes 
21e50 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33  32..35 and 35..3
21e60 39 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  9 should be page
21e70 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
21e80 72 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 76 65  re.      ** neve
21e90 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53  r 0xffffffff.  S
21ea0 6f 20 66 69 6c 6c 69 6e 67 20 70 50 61 67 65 72  o filling pPager
21eb0 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
21ec0 69 74 68 20 61 6c 6c 20 30 78 66 66 0a 20 20 20  ith all 0xff.   
21ed0 20 20 20 2a 2a 20 62 79 74 65 73 20 73 68 6f 75     ** bytes shou
21ee0 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20  ld suffice..    
21ef0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
21f00 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64  r an encrypted d
21f10 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74  atabase, the sit
21f20 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63  uation is more c
21f30 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20  omplex:  bytes. 
21f40 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f       ** 24..39 o
21f50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
21f60 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20  re white noise. 
21f70 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69   But the probabi
21f80 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a  lity of.      **
21f90 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65   white noising e
21fa0 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73  qualing 16 bytes
21fb0 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69   of 0xff is vani
21fc0 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f  shingly small so
21fd0 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f  .      ** we sho
21fe0 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e  uld still be ok.
21ff0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22000 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64  memset(pPager->d
22010 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c  bFileVers, 0xff,
22020 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
22030 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
22040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
22050 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
22060 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
22070 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65  a)[24];.      me
22080 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
22090 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
220a0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61  Vers, sizeof(pPa
220b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
220c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43  );.    }.  }.  C
220d0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50  ODEC1(pPager, pP
220e0 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  g->pData, pgno, 
220f0 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  3, rc = SQLITE_N
22100 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f  OMEM);..  PAGER_
22110 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
22120 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
22130 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
22140 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
22150 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
22160 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
22170 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  , pgno));.  PAGE
22180 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
22190 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
221a0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
221b0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
221c0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
221d0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
221e0 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  g)));..  return 
221f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
22200 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22210 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
22220 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
22230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22240 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
22250 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
22260 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
22270 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
22280 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
22290 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
222a0 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
222b0 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
222c0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
222d0 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
222e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
222f0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
22300 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
22310 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
22320 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
22330 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
22340 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
22350 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
22360 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
22370 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f  UNLOCK state (no
22380 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
22390 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
223a0 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
223b0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
223c0 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
223d0 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
223e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
223f0 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
22400 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
22410 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
22420 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
22430 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
22440 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
22450 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
22460 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
22470 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
22480 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
22490 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
224a0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
224b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
224c0 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
224d0 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
224e0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
224f0 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
22500 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
22510 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
22520 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
22530 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
22540 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
22550 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
22560 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
22570 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
22580 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
22590 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
225a0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
225b0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
225c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
225d0 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
225e0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
225f0 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
22600 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
22610 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
22620 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
22630 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
22640 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
22650 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
22660 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
22670 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
22680 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
22690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
226a0 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62  peration describ
226b0 65 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20  ed by (2) above 
226c0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
226d0 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20  , and if the.** 
226e0 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65  pager is in an e
226f0 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
22700 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
22710 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  L when this is c
22720 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  alled,.** the er
22730 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
22740 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
22750 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65  . It is permitte
22760 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a  d to read the.**
22770 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69   database when i
22780 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72  n SQLITE_FULL er
22790 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
227a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
227b0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
227c0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
227d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
227e0 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f  If an.** IO erro
227f0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  r occurs while l
22800 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
22810 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
22820 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  r a hot-journal.
22830 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69  ** file or rolli
22840 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
22850 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
22860 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
22870 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
22880 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
22890 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
228a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
228b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
228c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
228d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
228e0 74 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d  t isErrorReset =
228f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22900 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f   /* True if reco
22910 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f  vering from erro
22920 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a  r state */..  /*
22930 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
22940 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
22950 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
22960 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
22970 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
22980 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
22990 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
229a0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
229b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
229c0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
229d0 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  (MEMDB && pPager
229e0 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65  ->errCode) ){ re
229f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
22a00 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66  Code; }..  /* If
22a10 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
22a20 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74  s in an error-st
22a30 61 74 65 2c 20 6e 6f 77 20 69 73 20 61 20 63 68  ate, now is a ch
22a40 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20  ance to clear.  
22a50 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69  ** the error. Di
22a60 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
22a70 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
22a80 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61  cache and rollba
22a90 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74 20  ck.  ** any hot 
22aa0 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66  journal in the f
22ab0 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f  ile-system..  */
22ac0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
22ad0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  rrCode ){.    if
22ae0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
22af0 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
22b00 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  >zJournal ){.   
22b10 20 20 20 69 73 45 72 72 6f 72 52 65 73 65 74 20     isErrorReset 
22b20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
22b30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
22b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22b50 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
22b60 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
22b70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
22b80 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69  AGER_UNLOCK || i
22b90 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
22ba0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
22bb0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
22bc0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
22bd0 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c  int isHotJournal
22be0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
22bf0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
22c00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
22c10 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
22c20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
22c30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
22c40 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
22c50 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22c60 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
22c70 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  y );.      pPage
22c80 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
22c90 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c  _SHARED;.    }el
22ca0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
22cb0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
22cc0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
22cd0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
22ce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22cf0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
22d00 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
22d10 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
22d20 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22d30 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
22d40 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
22d50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
22d60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
22d70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
22d80 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
22d90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
22da0 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
22db0 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
22dc0 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
22dd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
22de0 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
22df0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
22e00 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
22e10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
22e20 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29   !isErrorReset )
22e30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22e40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d  pPager->state <=
22e50 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b   PAGER_SHARED );
22e60 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
22e70 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
22e80 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29  , &isHotJournal)
22e90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
22ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22eb0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
22ec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22ed0 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52      if( isErrorR
22ee0 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75  eset || isHotJou
22ef0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
22f00 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
22f10 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
22f20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
22f30 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
22f40 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
22f50 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
22f60 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
22f70 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
22f80 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
22f90 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
22fa0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
22fb0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
22fc0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
22fd0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
22fe0 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
22ff0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
23000 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
23010 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
23020 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
23030 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
23040 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
23050 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
23060 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
23070 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
23080 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
23090 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
230a0 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
230b0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
230c0 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
230d0 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
230e0 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
230f0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
23100 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
23110 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
23120 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
23130 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
23140 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
23150 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
23160 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
23170 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23180 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23190 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
231a0 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
231b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
231c0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
231d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
231e0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
231f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23200 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23210 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
23220 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
23230 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
23240 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
23250 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
23260 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
23270 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
23280 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f    }. .      /* O
23290 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
232a0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
232b0 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
232c0 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
232d0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63   ** exclusive-ac
232e0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
232f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
23300 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
23310 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  and.      ** pos
23320 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
23330 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
23340 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
23350 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
23360 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
23370 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
23380 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
23390 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
233a0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65  es.      ** a re
233b0 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
233c0 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndle..      */. 
233d0 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
233e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
233f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
23400 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
23410 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
23420 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
23430 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
23440 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b  SS_EXISTS,&res);
23450 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
23460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23470 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
23480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
23490 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
234a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
234b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
234c0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
234d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
234e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
234f0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
23500 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
23510 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23520 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
23530 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
23540 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
23550 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
23560 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
23570 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
23580 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
23590 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
235a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
235b0 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
235c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
235d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
235e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
235f0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
23600 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23610 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
23620 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
23630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
23640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23650 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
23660 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
23670 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
23680 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
23690 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
236a0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
236b0 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
236c0 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
236d0 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
236e0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
236f0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
23700 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
23710 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
23720 20 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20   it .           
23730 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
23740 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
23750 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
23760 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
23770 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
23780 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
23790 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
237a0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
237b0 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
237c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
237d0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
237e0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
237f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23800 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23810 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23820 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
23830 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
23840 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
23850 3a 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20  : Why are these 
23860 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73  cleared here? Is
23870 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a   it necessary? *
23880 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
23890 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
238a0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
238b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
238c0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
238d0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
238e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
238f0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
23900 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
23910 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
23920 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
23930 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
23940 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
23950 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
23960 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
23970 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
23980 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
23990 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
239a0 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
239b0 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
239c0 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
239d0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
239e0 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  cache..      */.
239f0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
23a00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
23a10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
23a20 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
23a30 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
23a40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23a50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23a60 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
23a70 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
23a80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23a90 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
23aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
23ab0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74  ert( (pPager->st
23ac0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
23ad0 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  D).           ||
23ae0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
23af0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
23b00 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53  r->state>PAGER_S
23b10 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a  HARED).      );.
23b20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
23b30 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c  Pager->pBackup |
23b40 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
23b50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
23b60 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
23b70 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
23b80 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
23b90 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
23ba0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
23bb0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
23bc0 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
23bd0 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
23be0 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
23bf0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
23c00 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
23c10 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
23c20 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
23c30 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
23c40 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
23c50 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
23c60 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
23c70 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
23c80 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
23c90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
23ca0 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
23cb0 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
23cc0 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
23cd0 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
23ce0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
23cf0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
23d00 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
23d10 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
23d20 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
23d30 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
23d40 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
23d50 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
23d60 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
23d70 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
23d80 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
23d90 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
23da0 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
23db0 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
23dc0 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
23dd0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
23de0 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
23df0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
23e00 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
23e10 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
23e20 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
23e30 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
23e40 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
23e50 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
23e60 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
23e70 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
23e80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68       */.      ch
23e90 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
23ea0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
23eb0 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
23ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
23ed0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
23ee0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
23ef0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
23f00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50  .        rc = pP
23f10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
23f20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
23f30 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
23f40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23f50 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
23f60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
23f70 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
23f80 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
23f90 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
23fa0 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
23fb0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
23fc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
23fd0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
23fe0 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
23ff0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
24000 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
24010 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
24020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24030 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
24040 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24060 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
24070 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
24080 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
24090 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
240a0 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
240b0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
240c0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
240d0 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
240e0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
240f0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
24100 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
24110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
24120 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
24130 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
24140 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
24150 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
24160 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24170 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
24180 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  _unlock() is a n
24190 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69  o-op for exclusi
241a0 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d  ve mode and in-m
241b0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
241c0 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   */.    pager_un
241d0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
241e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
241f0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
24200 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
24210 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
24220 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
24230 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
24240 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
24250 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
24260 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
24270 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
24280 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
24290 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
242a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
242b0 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
242c0 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
242d0 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
242e0 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
242f0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
24300 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
24310 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
24320 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
24330 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
24340 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73  Pager){.  if( (s
24350 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
24360 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
24370 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20  ache)==0).   && 
24380 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  (!pPager->exclus
24390 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
243a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29  r->journalOff>0)
243b0 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72   .  ){.    pager
243c0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
243d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
243e0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
243f0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
24400 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
24410 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
24420 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
24430 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
24440 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
24450 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
24460 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
24470 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
24480 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
24490 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
244a0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
244b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
244c0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
244d0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
244e0 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
244f0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
24500 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
24510 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
24520 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
24530 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
24540 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
24550 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
24560 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
24570 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
24580 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
24590 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
245a0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
245b0 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
245c0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
245d0 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
245e0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
245f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
24600 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
24610 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
24620 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
24630 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
24640 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
24650 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
24660 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
24670 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
24680 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
24690 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
246a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
246b0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
246c0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
246d0 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
246e0 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
246f0 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
24700 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
24710 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
24720 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
24730 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
24740 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
24750 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
24760 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
24770 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
24780 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
24790 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
247a0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
247b0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
247c0 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
247d0 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
247e0 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
247f0 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
24800 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
24810 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
24820 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
24830 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
24840 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
24850 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
24860 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
24870 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
24880 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
24890 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
248a0 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65  two seperate sce
248b0 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
248c0 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
248d0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
248e0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
248f0 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
24900 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
24910 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
24920 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
24930 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
24940 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
24950 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
24960 63 68 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  che to populate 
24970 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
24980 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
24990 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
249a0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
249b0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
249c0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
249d0 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
249e0 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
249f0 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
24a00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
24a10 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
24a20 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
24a30 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
24a40 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
24a50 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
24a60 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
24a70 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
24a80 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
24a90 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
24aa0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
24ab0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
24ac0 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
24ad0 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
24ae0 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
24af0 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
24b00 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
24b10 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
24b20 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
24b30 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
24b40 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
24b50 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
24b60 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
24b70 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
24b80 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
24b90 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
24ba0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
24bb0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
24bc0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
24bd0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
24be0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
24bf0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
24c00 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
24c10 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
24c20 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
24c30 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
24c40 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
24c50 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
24c60 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
24c70 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
24c80 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
24c90 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
24ca0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
24cb0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
24cc0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
24cd0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
24ce0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
24cf0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
24d00 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
24d10 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
24d20 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
24d30 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
24d40 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
24d50 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
24d60 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
24d70 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
24d80 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
24d90 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
24da0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
24db0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
24dc0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
24dd0 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
24de0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
24df0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
24e00 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
24e10 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
24e20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24e30 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
24e40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
24e50 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
24e60 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
24e70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
24e80 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
24e90 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
24ea0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
24eb0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
24ec0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
24ed0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
24ee0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
24ef0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
24f00 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
24f10 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
24f20 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
24f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24f40 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e  ->state>PAGER_UN
24f50 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  LOCK );..  if( p
24f60 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
24f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24f80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
24f90 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
24fa0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
24fb0 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61   state, return a
24fc0 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74  n error immediat
24fd0 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ely. .  ** Other
24fe0 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68  wise, request th
24ff0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
25000 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f  PCache layer. */
25010 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
25020 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
25030 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  K && pPager->err
25040 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
25050 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  L ){.    rc = pP
25060 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
25070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
25080 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
25090 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
250a0 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70  che, pgno, 1, pp
250b0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Page);.  }..  if
250c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
250d0 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
250e0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
250f0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
25100 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  ) returned an er
25110 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ror or the.    *
25120 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65  * pager was alre
25130 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
25140 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
25150 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
25160 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74  lled..    ** Set
25170 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75   pPg to 0 and ju
25180 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74  mp to the except
25190 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f  ion handler.  */
251a0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
251b0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
251c0 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  uire_err;.  }.  
251d0 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
251e0 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
251f0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
25200 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50  age)->pPager==pP
25210 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65  ager || (*ppPage
25220 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  )->pPager==0 );.
25230 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
25240 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
25250 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
25260 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
25270 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
25280 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
25290 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
252a0 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
252b0 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
252c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
252d0 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
252e0 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
252f0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
25300 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52  er) );.    PAGER
25310 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
25320 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  it);.    return 
25330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
25340 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
25350 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
25360 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
25370 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
25380 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
25390 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
253a0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61    */.    int nMa
253b0 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  x;..    PAGER_IN
253c0 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
253d0 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  );.    pPg = *pp
253e0 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
253f0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
25400 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
25410 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
25420 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
25430 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
25440 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
25450 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
25460 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
25470 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
25480 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
25490 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
254a0 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
254b0 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
254c0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
254d0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
254e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
254f0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
25500 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
25510 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
25520 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
25530 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
25540 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28   &nMax);.    if(
25550 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25560 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
25570 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
25580 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
25590 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e  EMDB || nMax<(in
255a0 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  t)pgno || noCont
255b0 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
255c0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
255d0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
255e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 09  ger->mxPgno ){..
255f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
25600 3b 0a 09 67 6f 74 6f 20 70 61 67 65 72 5f 61 63  ;..goto pager_ac
25610 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
25620 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
25630 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
25640 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
25650 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
25660 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
25670 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
25680 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
25690 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
256a0 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
256b0 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
256c0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
256d0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
256e0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
256f0 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
25700 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
25710 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
25720 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
25730 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
25740 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
25750 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
25760 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
25770 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
25780 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
25790 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
257a0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
257b0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
257c0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
257d0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
257e0 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
257f0 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
25800 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
25810 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
25820 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
25830 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
25840 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
25850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25860 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
25870 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
25880 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
25890 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
258a0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
258b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
258c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
258d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
258e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
258f0 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
25900 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
25910 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
25920 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
25930 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
25940 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
25950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25960 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
25970 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
25980 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
25990 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
259a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
259b0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
259c0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
259d0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
259e0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
259f0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
25a00 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
25a10 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
25a20 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
25a30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
25a40 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
25a50 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
25a60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
25a70 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
25a80 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
25a90 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
25aa0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
25ab0 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
25ac0 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
25ad0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
25ae0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
25af0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
25b00 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
25b10 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
25b20 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
25b30 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
25b40 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25b50 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
25b60 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
25b70 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41   not in cache. A
25b80 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66  lso, return 0 if
25b90 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69   the .** pager i
25ba0 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  s in PAGER_UNLOC
25bb0 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  K state when thi
25bc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25bd0 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  lled,.** or if t
25be0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
25bf0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
25c00 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
25c10 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  FULL..**.** See 
25c20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
25c30 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
25c40 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
25c50 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
25c60 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
25c70 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
25c80 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
25c90 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
25ca0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
25cb0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
25cc0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
25cd0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
25ce0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
25cf0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
25d00 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
25d10 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
25d20 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
25d30 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
25d40 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
25d50 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
25d60 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
25d70 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
25d80 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
25d90 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
25da0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
25db0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
25dc0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
25dd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
25de0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50  Pager->state > P
25df0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
25e00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
25e10 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
25e20 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
25e30 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
25e40 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
25e50 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
25e60 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
25e70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
25e80 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
25e90 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
25ea0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
25eb0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
25ec0 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
25ed0 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
25ee0 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
25ef0 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
25f00 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
25f10 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
25f20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
25f30 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
25f40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
25f50 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
25f60 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
25f70 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
25f80 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
25f90 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
25fa0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
25fb0 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
25fc0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
25fd0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
25fe0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   If the main jou
25ff0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c  rnal file has al
26000 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
26010 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  d, ensure that t
26020 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  he.** sub-journa
26030 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74  l file is open t
26040 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  oo. If the main 
26050 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f  journal is not o
26060 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  pen,.** this fun
26070 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26080 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
26090 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
260a0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
260b0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
260c0 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54  an. .** An SQLIT
260d0 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
260e0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
260f0 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
26100 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  .** sqlite3OsOpe
26110 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  n() fails..*/.st
26120 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
26130 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
26140 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26150 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26160 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
26170 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
26180 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
26190 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
261a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
261b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
261c0 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
261d0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
261e0 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
261f0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
26200 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
26210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26220 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
26230 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
26240 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45  er->sjfd, SQLITE
26250 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
26260 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
26270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26280 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26290 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
262a0 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
262b0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
262c0 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
262d0 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
262e0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
262f0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
26300 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
26310 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
26320 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
26330 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
26340 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
26350 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
26360 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
26370 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
26380 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
26390 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
263a0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
263b0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
263c0 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
263d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
263e0 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
263f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26400 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
26410 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
26420 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
26430 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
26440 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
26450 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
26460 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
26470 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
26480 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
26490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
264a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
264b0 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
264c0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
264d0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
264e0 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
264f0 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
26500 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
26510 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
26520 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
26530 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
26540 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
26550 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
26560 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
26570 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
26580 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
26590 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
265a0 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
265b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
265c0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
265d0 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
265e0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
265f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
26600 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
26610 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
26620 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
26630 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
26640 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
26650 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
26660 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26670 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
26680 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
26690 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
266a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
266b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
266e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
266f0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
26700 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
26710 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
26720 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
26730 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
26740 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
26750 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
26760 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26770 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
26780 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26790 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
267a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
267b0 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72  E_OFF );.  asser
267c0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
267d0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
267e0 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
267f0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
26800 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
26810 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
26820 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
26830 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
26840 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
26850 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
26860 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
26870 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
26880 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
26890 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
268a0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
268b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
268c0 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 72 65 61   TODO: Is it rea
268d0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  lly possible to 
268e0 67 65 74 20 68 65 72 65 20 77 69 74 68 20 64 62  get here with db
268f0 53 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66  SizeValid==0? If
26900 20 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63   not,.  ** the c
26910 61 6c 6c 20 74 6f 20 50 61 67 65 72 50 61 67 65  all to PagerPage
26920 63 6f 75 6e 74 28 29 20 63 61 6e 20 62 65 20 72  count() can be r
26930 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74  emoved..  */.  t
26940 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
26950 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
26960 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
26970 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
26980 72 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67 65 72  r, 0);..  pPager
26990 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
269a0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
269b0 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
269c0 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
269d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
269e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
269f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
26a00 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a  .  /* Open the j
26a10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
26a20 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
26a30 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20   open. */.  if( 
26a40 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
26a50 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
26a60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
26a70 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
26a80 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
26a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
26aa0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
26ab0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
26ac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
26ad0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26af0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
26b00 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
26b10 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  e */.        SQL
26b20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
26b30 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
26b40 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28  REATE|.        (
26b50 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
26b60 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53   ? .          (S
26b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
26b80 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
26b90 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
26ba0 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53  L):.          (S
26bb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
26bc0 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20  JOURNAL).       
26bd0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
26be0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
26bf0 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d  WRITE.      rc =
26c00 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
26c10 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  pen(.          p
26c20 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
26c30 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
26c40 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
26c50 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
26c60 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65  ).      );.#else
26c70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26c80 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
26c90 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
26ca0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
26cb0 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  lags, 0);.#endif
26cc0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
26cd0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
26ce0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
26cf0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a  r->jfd) );.  }..
26d00 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
26d10 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
26d20 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
26d30 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
26d40 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  n .  ** the sub-
26d50 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
26d60 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
26d70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26d80 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43  {.    /* TODO: C
26d90 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
26da0 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
26db0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
26dc0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
26dd0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
26de0 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72  Size;.    pPager
26df0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
26e00 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
26e10 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
26e20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
26e30 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
26e40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
26e50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
26e60 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
26e70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26e80 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Hdr = 0;.    rc 
26e90 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
26ea0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
26eb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26ec0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  OK && pPager->nS
26ed0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
26ee0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
26ef0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
26f00 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
26f10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
26f20 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
26f30 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
26f40 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
26f50 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
26f60 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
26f70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
26f80 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
26f90 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
26fa0 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
26fb0 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
26fc0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
26fd0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
26fe0 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
26ff0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
27000 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
27010 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
27020 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
27030 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
27040 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
27050 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
27060 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
27070 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
27080 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
27090 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
270a0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
270b0 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
270c0 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
270d0 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
270e0 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
270f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
27100 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
27110 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  ry or in-memory 
27120 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f  file and, the jo
27130 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a  urnal file is .*
27140 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68  * opened if it h
27150 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65  as not been alre
27160 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f  ady. For a tempo
27170 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f  rary file, the o
27180 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68  pening .** of th
27190 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
271a0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
271b0 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74   there is an act
271c0 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20  ual need to .** 
271d0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
271e0 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20  rnal. TODO: Why 
271f0 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79  handle temporary
27200 20 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74   files different
27210 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ly?.**.** If the
27220 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27230 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69   opened (or if i
27240 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
27250 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f  n), then a.** jo
27260 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
27270 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
27280 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a  tart of it..**.*
27290 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
272a0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
272b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
272c0 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
272d0 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
272e0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
272f0 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
27300 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
27310 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
27320 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
27330 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
27340 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
27350 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
27360 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
27370 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
27380 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
27390 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
273a0 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
273b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
273c0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
273d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
273e0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
273f0 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
27400 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
27410 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
27420 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
27430 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
27440 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
27450 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
27460 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
27470 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
27480 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
27490 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
274a0 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
274b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
274c0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
274d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
274e0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
274f0 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
27500 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
27510 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69 66 28  jInMemory;.  if(
27520 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
27530 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
27540 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27550 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
27560 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27570 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67   !MEMDB && !pPag
27580 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
27590 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  .    /* Obtain a
275a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
275b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
275c0 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
275d0 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
275e0 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
275f0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
27600 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
27610 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
27620 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75 73 79   The.    ** busy
27630 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
27640 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
27650 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
27660 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
27670 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
27680 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
27690 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
276a0 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
276b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
276c0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
276d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
276e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
276f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
27700 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
27710 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
27720 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
27730 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
27740 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
27750 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
27760 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
27770 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
27780 20 49 66 20 74 68 65 20 72 65 71 75 69 72 65 64   If the required
27790 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75 63 63   locks were succ
277a0 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
277b0 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  d, open the jour
277c0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
277d0 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 66 69  and write the fi
277e0 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
277f0 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  er to it..    */
27800 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
27810 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
27820 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
27830 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
27840 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63  _OFF ){.      rc
27850 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
27860 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
27870 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
27880 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27890 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
278a0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
278b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
278c0 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
278d0 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
278e0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
278f0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
27900 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
27910 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
27920 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
27930 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
27940 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
27950 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
27960 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
27970 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27980 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
27990 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
279a0 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
279b0 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
279c0 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
279d0 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
279e0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
279f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
27a00 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
27a10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27a20 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
27a30 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
27a40 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
27a50 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
27a60 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
27a70 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
27a80 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
27a90 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
27aa0 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
27ab0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
27ac0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
27ad0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
27ae0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
27af0 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
27b00 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 21  _OK );.  if( rc!
27b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27b20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27b30 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b  r->dbModified );
27b40 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61  .    /* Ignore a
27b50 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74  ny IO error that
27b60 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 70   occurs within p
27b70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
27b80 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20  tion(). The.    
27b90 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  ** purpose of th
27ba0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65  is call is to re
27bb0 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
27bc0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
27bd0 67 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73  ger.    ** sub-s
27be0 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27  ystem. It doesn'
27bf0 74 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20  t matter if the 
27c00 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
27c10 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20  not properly.   
27c20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74   ** finalized at
27c30 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e   this point (sin
27c40 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76  ce it is not a v
27c50 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
27c60 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a  e anyway)..    *
27c70 2f 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f  /.    pager_end_
27c80 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
27c90 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  er, 0);.  }.  re
27ca0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27cb0 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
27cc0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
27cd0 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
27ce0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
27cf0 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
27d00 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
27d10 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
27d20 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
27d30 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
27d40 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
27d50 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
27d60 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
27d70 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
27d80 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
27d90 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
27da0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
27db0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
27dc0 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
27dd0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
27de0 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
27df0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
27e00 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
27e10 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
27e20 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
27e30 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
27e40 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
27e50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27e60 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72  OK;..  /* This r
27e70 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61  outine is not ca
27e80 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72  lled unless a tr
27e90 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
27ea0 72 65 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20  ready been.  ** 
27eb0 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
27ec0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27ed0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
27ee0 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49  ERVED );..  /* I
27ef0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62  f an error has b
27f00 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64  een previously d
27f10 65 74 65 63 74 65 64 2c 20 77 65 20 73 68 6f 75  etected, we shou
27f20 6c 64 20 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 63  ld not be.  ** c
27f30 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
27f40 69 6e 65 2e 20 20 52 65 70 65 61 74 20 74 68 65  ine.  Repeat the
27f50 20 65 72 72 6f 72 20 66 6f 72 20 72 6f 62 75 73   error for robus
27f60 74 6e 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tness..  */.  if
27f70 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
27f80 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75  errCode) )  retu
27f90 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
27fa0 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72  de;..  /* Higher
27fb0 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20  -level routines 
27fc0 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20  never call this 
27fd0 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61  function if data
27fe0 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  base is not.  **
27ff0 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20   writable.  But 
28000 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75  check anyway, ju
28010 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  st for robustnes
28020 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
28030 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  R(pPager->readOn
28040 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ly) ) return SQL
28050 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73  ITE_PERM;..  ass
28060 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
28070 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
28080 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
28090 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
280a0 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
280b0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
280c0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
280d0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
280e0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
280f0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
28100 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
28110 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
28120 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
28130 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
28140 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69  g) && !subjRequi
28150 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
28160 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
28170 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65  dified = 1;.  }e
28180 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
28190 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
281a0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
281b0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
281c0 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
281d0 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
281e0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
281f0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
28200 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
28210 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
28220 20 20 20 2a 2a 20 48 69 67 68 65 72 20 6c 65 76     ** Higher lev
28230 65 6c 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75  el routines shou
28240 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
28250 73 74 61 72 74 65 64 20 61 20 74 72 61 6e 73 61  started a transa
28260 63 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20 77 68  ction,.    ** wh
28270 69 63 68 20 6d 65 61 6e 73 20 74 68 65 79 20 68  ich means they h
28280 61 76 65 20 61 63 71 75 69 72 65 64 20 74 68 65  ave acquired the
28290 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73   necessary locks
282a0 20 61 6e 64 20 6f 70 65 6e 65 64 0a 20 20 20 20   and opened.    
282b0 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  ** a rollback jo
282c0 75 72 6e 61 6c 2e 20 20 44 6f 75 62 6c 65 2d 63  urnal.  Double-c
282d0 68 65 63 6b 20 74 6f 20 6d 61 6b 65 73 20 73 75  heck to makes su
282e0 72 65 20 74 68 69 73 20 69 73 20 74 68 65 20 63  re this is the c
282f0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
28300 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28310 72 42 65 67 69 6e 28 70 50 61 67 65 72 2c 20 30  rBegin(pPager, 0
28320 2c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  , pPager->subjIn
28330 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20 69 66 28  Memory);.    if(
28340 20 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54   NEVER(rc!=SQLIT
28350 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  E_OK) ){.      r
28360 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
28370 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
28380 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
28390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
283a0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
283b0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
283c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
283d0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
283e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
283f0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
28400 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
28410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28420 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28430 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
28440 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
28450 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
28460 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
28470 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
28480 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
28490 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
284a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
284b0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
284c0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
284d0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
284e0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
284f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
28500 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
28510 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
28520 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28530 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70  !pageInJournal(p
28540 50 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50  Pg) && isOpen(pP
28550 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
28560 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
28570 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
28580 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
28590 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
285a0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
285b0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
285c0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
285d0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
285e0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
285f0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
28600 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
28610 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
28620 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
28630 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
28640 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
28650 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
28660 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
28670 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
28680 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
28690 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
286a0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
286b0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
286c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
286d0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
286e0 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
286f0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
28700 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
28710 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
28720 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
28730 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28740 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
28750 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
28760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28770 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28780 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
28790 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
287a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
287b0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
287e0 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20  Off + 4);.      
287f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
28800 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
28810 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20  ->pageSize+4;.  
28820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
28850 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
28860 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
28870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
28880 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
28890 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
288a0 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
288b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
288c0 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
288d0 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
288e0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
288f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
28900 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
28910 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
28920 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
28930 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
28940 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
28950 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
28960 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28970 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
28980 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
28990 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
289a0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
289b0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
289c0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
289d0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
289e0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
289f0 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
28a00 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
28a10 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
28a20 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
28a30 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
28a40 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72  urred while jour
28a50 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  nalling the.    
28a60 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
28a70 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
28a80 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
28a90 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
28aa0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  age..        ** 
28ab0 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
28ac0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
28ad0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
28ae0 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20  the logic in.   
28af0 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b       ** playback
28b00 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
28b10 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
28b20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
28b30 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20   restored.      
28b40 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
28b50 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
28b60 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
28b70 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
28b80 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
28b90 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
28ba0 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20  may follow..    
28bb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
28bc0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
28bd0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
28be0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
28bf0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
28c00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
28c10 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
28c20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28c30 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
28c40 73 20 6f 63 63 75 72 72 65 64 20 77 72 69 74 69  s occurred writi
28c50 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
28c60 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
28c70 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
28c80 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
28c90 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
28ca0 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
28cb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
28cc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
28ce0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28cf0 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67   }..        pPag
28d00 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
28d10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
28d20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
28d30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
28d40 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
28d50 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
28d60 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
28d70 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28d80 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
28d90 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
28da0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
28db0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
28dc0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
28dd0 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54        rc |= addT
28de0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
28df0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
28e00 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
28e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
28e30 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
28e40 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
28e50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
28e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
28e80 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
28e90 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
28ea0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
28eb0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
28ec0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
28ed0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
28ee0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
28ef0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
28f00 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
28f10 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
28f20 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
28f30 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
28f40 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
28f50 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
28f60 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
28f70 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
28f80 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
28f90 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20  )?1:0)));.      
28fa0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
28fb0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
28fc0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
28fd0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
28fe0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
28ff0 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
29000 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
29010 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
29020 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
29030 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
29040 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
29050 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
29060 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
29070 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
29080 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
29090 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
290a0 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
290b0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
290c0 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
290d0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
290e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
290f0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
29100 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29110 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
29120 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
29130 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  turn..  */.  ass
29140 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
29150 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
29160 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
29170 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
29180 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
29190 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
291a0 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
291b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
291c0 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
291d0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
291e0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
291f0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
29200 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61  e .** making cha
29210 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20  nges to a page. 
29220 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
29230 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
29240 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68   value .** of th
29250 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
29260 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
29270 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  o change any pag
29280 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a  e data unless .*
29290 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
292a0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
292b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
292c0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
292d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
292e0 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
292f0 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
29300 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
29310 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
29320 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
29330 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
29340 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
29350 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
29360 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
29370 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
29380 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
29390 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
293a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
293b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
293c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
293d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
293e0 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
293f0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
29400 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61  returned.** as a
29410 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65  ppropriate. Othe
29420 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
29430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29440 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
29450 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
29460 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29470 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
29480 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
29490 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
294a0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
294b0 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
294c0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
294d0 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
294e0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
294f0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
29500 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
29510 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
29520 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
29530 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
29540 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
29550 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
29560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29570 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
29580 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
29590 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
295a0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20      int nPage;  
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
295c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
295d0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
295e0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
295f0 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29610 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
29620 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
29630 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
29640 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
29650 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
29660 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
29670 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
29680 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
29690 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
296a0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
296b0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
296c0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
296d0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
296e0 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
296f0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
29700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
29710 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
29720 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
29730 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
29740 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
29750 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
29760 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
29770 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
29780 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
29790 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
297a0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
297b0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
297c0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
297d0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
297e0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
297f0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
29800 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
29810 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
29820 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
29830 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
29840 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
29850 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
29860 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
29870 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
29880 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
29890 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  Count);.    if( 
298a0 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
298b0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
298c0 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
298d0 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
298e0 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
298f0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
29900 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
29910 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
29920 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
29930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
29940 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
29950 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
29960 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
29970 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
29980 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
29990 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
299a0 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
299b0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
299c0 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
299d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
299e0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
299f0 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
29a00 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
29a10 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d      if( pg==pPg-
29a20 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65  >pgno || !sqlite
29a30 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
29a40 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
29a50 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pg) ){.        i
29a60 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
29a70 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
29a80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
29a90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
29aa0 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
29ab0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
29ac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
29ae0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
29af0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
29b00 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
29b10 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
29b20 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
29b30 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
29b40 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
29b50 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
29b60 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
29b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
29b90 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
29ba0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
29bc0 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70  e if( (pPage = p
29bd0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
29be0 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20  er, pg))!=0 ){. 
29bf0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
29c00 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
29c10 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
29c20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
29c30 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
29c40 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
29c50 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
29c60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
29c70 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44    /* If the PGHD
29c80 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
29c90 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20   is set for any 
29ca0 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67  of the nPage pag
29cb0 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  es .    ** start
29cc0 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e  ing at pg1, then
29cd0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
29ce0 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  set for all of t
29cf0 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20  hem. Because.   
29d00 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61   ** writing to a
29d10 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67  ny of these nPag
29d20 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61  e pages may dama
29d30 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74  ge the others, t
29d40 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
29d50 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74  l file must cont
29d60 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70  ain sync()ed cop
29d70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ies of all of th
29d80 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  em.    ** before
29d90 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e   any of them can
29da0 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
29db0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29dc0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
29dd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29de0 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29  OK && needSync )
29df0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29e00 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
29e10 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  ->noSync==0 );. 
29e20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
29e30 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  i<nPage; ii++){.
29e40 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
29e50 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
29e60 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
29e70 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
29e80 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20   pPage ){.      
29e90 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73      pPage->flags
29ea0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
29eb0 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  YNC;.          s
29ec0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29ed0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
29ee0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
29ef0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
29f00 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
29f10 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
29f20 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
29f30 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
29f40 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b  ->doNotSync = 0;
29f50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
29f60 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
29f70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
29f80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29f90 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
29fa0 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
29fb0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
29fc0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
29fd0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
29fe0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
29ff0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
2a000 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
2a010 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
2a020 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
2a030 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
2a040 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
2a050 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
2a060 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
2a070 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
2a080 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73  eturn pPg->flags
2a090 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a  &PGHDR_DIRTY;.}.
2a0a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
2a0b0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
2a0c0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
2a0d0 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
2a0e0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
2a0f0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
2a100 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
2a110 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
2a120 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
2a130 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
2a140 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
2a150 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73   as dirty.  This
2a160 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
2a170 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74  ample, when.** t
2a180 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
2a190 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66   added as a leaf
2a1a0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2a1b0 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63   and so its.** c
2a1c0 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72  ontent no longer
2a1d0 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   matters..**.** 
2a1e0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
2a1f0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
2a200 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
2a210 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
2a220 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
2a230 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
2a240 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d  sed. The pager m
2a250 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
2a260 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
2a270 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
2a280 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
2a290 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
2a2a0 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
2a2b0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71  timization can q
2a2c0 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
2a2d0 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20  ed of large .** 
2a2e0 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
2a2f0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2a300 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2a310 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2a320 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2a330 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2a340 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
2a350 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70  GHDR_DIRTY) && p
2a360 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2a370 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45  t==0 ){.    PAGE
2a380 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52  RTRACE(("DONT_WR
2a390 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
2a3a0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
2a3b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2a3c0 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
2a3d0 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
2a3e0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
2a3f0 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66  gno)).    pPg->f
2a400 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
2a410 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66  NT_WRITE;.#ifdef
2a420 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
2a430 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
2a440 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
2a450 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
2a460 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
2a470 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2a480 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
2a490 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ment the value o
2a4a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2a4b0 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63  ile .** change-c
2a4c0 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61  ounter, stored a
2a4d0 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65  s a 4-byte big-e
2a4e0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74  ndian integer st
2a4f0 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79  arting at .** by
2a500 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20  te offset 24 of 
2a510 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2a520 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44  **.** If the isD
2a530 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69  irectMode flag i
2a540 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  s zero, then thi
2a550 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c  s is done by cal
2a560 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
2a570 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
2a580 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64  page 1, then mod
2a590 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
2a5a0 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  nts of the.** pa
2a5b0 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73  ge data. In this
2a5c0 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77   case the file w
2a5d0 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77  ill be updated w
2a5e0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
2a5f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
2a600 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
2a610 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d  ** The isDirectM
2a620 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c  ode flag may onl
2a630 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  y be non-zero if
2a640 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73   the library was
2a650 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74   compiled.** wit
2a660 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  h the SQLITE_ENA
2a670 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2a680 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
2a690 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a  In this case,.**
2a6a0 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20   if isDirect is 
2a6b0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
2a6c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a6d0 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65   is updated dire
2a6e0 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69  ctly.** by writi
2a6f0 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65  ng an updated ve
2a700 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
2a710 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
2a720 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  the .** sqlite3O
2a730 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  sWrite() functio
2a740 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2a750 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2a760 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
2a770 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
2a780 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e  irectMode){.  in
2a790 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a7a0 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20  ;..  /* Declare 
2a7b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  and initialize c
2a7c0 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
2a7d0 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74  'isDirect'. If t
2a7e0 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77  he.  ** atomic-w
2a7f0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2a800 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20  n is enabled in 
2a810 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e  this build, then
2a820 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69   isDirect.  ** i
2a830 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
2a840 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
2a850 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63  d as the isDirec
2a860 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a  tMode parameter.
2a870 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e    ** to this fun
2a880 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
2a890 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73  , it is always s
2a8a0 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  et to zero..  **
2a8b0 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69  .  ** The idea i
2a8c0 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74  s that if the at
2a8d0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2a8e0 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  ization is not. 
2a8f0 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63   ** enabled at c
2a900 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
2a910 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d   compiler can om
2a920 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a  it the tests of.
2a930 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20    ** 'isDirect' 
2a940 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61  below, as well a
2a950 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c  s the block encl
2a960 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  osed in the.  **
2a970 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29   "if( isDirect )
2a980 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a  " condition..  *
2a990 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2a9a0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2a9b0 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49  RITE.# define DI
2a9c0 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73  RECT_MODE 0.  as
2a9d0 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f  sert( isDirectMo
2a9e0 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  de==0 );.  UNUSE
2a9f0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69  D_PARAMETER(isDi
2aa00 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65  rectMode);.#else
2aa10 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
2aa20 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f  _MODE isDirectMo
2aa30 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  de.#endif..  ass
2aa40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2aa50 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
2aa60 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ED );.  if( !pPa
2aa70 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2aa80 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Done && pPager->
2aa90 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
2aaa0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20  PgHdr *pPgHdr;  
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aac0 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   Reference to pa
2aad0 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20  ge 1 */.    u32 
2aae0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20  change_counter; 
2aaf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
2ab00 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68  tial value of ch
2ab10 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
2ab20 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ld */..    asser
2ab30 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
2ab40 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70  File && isOpen(p
2ab50 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
2ab60 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
2ab70 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
2ab80 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
2ab90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2aba0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
2abb0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
2abc0 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d  assert( pPgHdr==
2abd0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
2abe0 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  OK );..    /* If
2abf0 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65   page one was fe
2ac00 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c  tched successful
2ac10 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ly, and this fun
2ac20 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20  ction is not.   
2ac30 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   ** operating in
2ac40 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61   direct-mode, ma
2ac50 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62  ke page 1 writab
2ac60 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e  le.  When not in
2ac70 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20   .    ** direct 
2ac80 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20  mode, page 1 is 
2ac90 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63  always held in c
2aca0 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74  ache and hence t
2acb0 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20  he PagerGet().  
2acc0 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c    ** above is al
2acd0 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20  ways successful 
2ace0 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41  - hence the ALWA
2acf0 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45  YS on rc==SQLITE
2ad00 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _OK..    */.    
2ad10 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45  if( !DIRECT_MODE
2ad20 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53   && ALWAYS(rc==S
2ad30 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20  QLITE_OK) ){.   
2ad40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ad50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
2ad60 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2ad70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ad80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72  ){.      /* Incr
2ad90 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
2ada0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
2adb0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
2adc0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20  yte 24. */.     
2add0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
2ade0 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
2adf0 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
2ae00 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
2ae10 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2ae20 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  ++;.      put32b
2ae30 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
2ae40 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
2ae50 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
2ae60 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e  .      /* If run
2ae70 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d  ning in direct m
2ae80 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63  ode, write the c
2ae90 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
2aea0 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a  1 to the file. *
2aeb0 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52 45  /.      if( DIRE
2aec0 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20  CT_MODE ){.     
2aed0 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
2aee0 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44  Buf = pPgHdr->pD
2aef0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ata;.        ass
2af00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46  ert( pPager->dbF
2af10 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20  ileSize>0 );.   
2af20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2af30 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2af40 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
2af50 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
2af60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2af70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2af80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2af90 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2afa0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2afb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2afc0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
2afd0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
2afe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2aff0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
2b000 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
2b010 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
2b020 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
2b030 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
2b040 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
2b050 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69  ync the pager fi
2b060 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73  le to disk. This
2b070 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2b080 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a  in-memory files.
2b090 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68  ** or pages with
2b0a0 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
2b0b0 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  c flag set..**.*
2b0c0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2b0d0 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   or called on a 
2b0e0 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
2b0f0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74  it is a no-op, t
2b100 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
2b110 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2b120 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  K. Otherwise, an
2b130 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2b140 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
2b150 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
2b160 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
2b170 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2b1a0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61  turn code */.  a
2b1b0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
2b1c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
2b1d0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
2b1e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2b1f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
2b200 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
2b210 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
2b220 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
2b230 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b240 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
2b250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
2b260 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
2b270 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
2b280 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
2b290 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
2b2a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
2b2b0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
2b2c0 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
2b2d0 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
2b2e0 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
2b2f0 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
2b300 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
2b310 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
2b320 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
2b330 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
2b340 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
2b350 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
2b360 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a  sures that:.**.*
2b370 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
2b380 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63  se file change-c
2b390 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65  ounter is update
2b3a0 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f  d,.**   * the jo
2b3b0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
2b3c0 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d  (unless the atom
2b3d0 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2b3e0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a  ation is used),.
2b3f0 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79  **   * all dirty
2b400 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
2b410 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
2b420 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a  se file, .**   *
2b430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b440 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
2b450 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61  (if required), a
2b460 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  nd.**   * the da
2b470 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
2b480 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ed. .**.** The o
2b490 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72  nly thing that r
2b4a0 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
2b4b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2b4c0 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20   is to finalize 
2b4d0 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75  .** (delete, tru
2b4e0 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
2b4f0 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29  e first part of)
2b500 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b510 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65  e (or .** delete
2b520 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2b530 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
2b540 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
2b550 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
2b560 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
2b570 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
2b580 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
2b590 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
2b5a0 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  an sqlite3PagerC
2b5b0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
2b5c0 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  call..**.** If t
2b5d0 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
2b5e0 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73  er - noSync - is
2b5f0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2b600 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2b610 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73  self.** is not s
2b620 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  ynced. The calle
2b630 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69  r must call sqli
2b640 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64  te3PagerSync() d
2b650 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79  irectly to.** sy
2b660 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
2b670 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
2b680 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54  ing CommitPhaseT
2b690 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74  wo() to delete t
2b6a0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
2b6b0 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
2b6c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2b6d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
2b6e0 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ne(.  Pager *pPa
2b6f0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
2b700 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
2b710 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
2b720 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
2b730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2b740 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d   not NULL, the m
2b750 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
2b760 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79  me */.  int noSy
2b770 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
2b780 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2b790 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e  to omit the xSyn
2b7a0 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  c on the db file
2b7b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2b7c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2b7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2b7e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2b7f0 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2b800 69 73 20 6e 65 76 65 72 20 73 65 74 20 69 66 20  is never set if 
2b810 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46  journal_mode=OFF
2b820 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2b830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2b840 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2b850 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67  MODE_OFF || pPag
2b860 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
2b870 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20  0 );..  /* If a 
2b880 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63 75  prior error occu
2b890 72 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  rred, this routi
2b8a0 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
2b8b0 20 63 61 6c 6c 65 64 2e 20 20 52 4f 4c 4c 42 41   called.  ROLLBA
2b8c0 43 4b 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 61  CK.  ** is the a
2b8d0 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 70 6f  ppropriate respo
2b8e0 6e 73 65 20 74 6f 20 61 6e 20 65 72 72 6f 72 2c  nse to an error,
2b8f0 20 6e 6f 74 20 43 4f 4d 4d 49 54 2e 20 20 47 75   not COMMIT.  Gu
2b900 61 72 64 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a  ard against.  **
2b910 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 73 20 62   coding errors b
2b920 79 20 72 65 70 65 61 74 69 6e 67 20 74 68 65 20  y repeating the 
2b930 70 72 69 6f 72 20 65 72 72 6f 72 2e 20 2a 2f 0a  prior error. */.
2b940 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2b950 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
2b960 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2b970 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54  rCode;..  PAGERT
2b980 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20  RACE(("DATABASE 
2b990 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
2b9a0 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25  aster=%s nSize=%
2b9b0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
2b9c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2b9d0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
2b9e0 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66  >dbSize));..  if
2b9f0 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
2ba00 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b  r->dbModified ){
2ba10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2ba20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2ba30 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
2ba40 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
2ba50 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
2ba60 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
2ba70 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2ba80 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73  alled, it is mos
2ba90 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f  tly a no-op.  Ho
2baa0 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a  wever, any.    *
2bab0 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67  * backup in prog
2bac0 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65  ress needs to be
2bad0 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20   restarted..    
2bae0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  */.    sqlite3Ba
2baf0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
2bb00 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
2bb10 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
2bb20 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
2bb30 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d  YNCED && pPager-
2bb40 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a  >dbModified ){..
2bb50 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
2bb60 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74  wing block updat
2bb70 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
2bb80 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68  unter. Exactly h
2bb90 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ow it.    ** doe
2bba0 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
2bbb0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
2bbc0 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
2bbd0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
2bbe0 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c      ** was enabl
2bbf0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2bc00 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20  me, and if this 
2bc10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74  transaction meet
2bc20 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 75  s the .    ** ru
2bc30 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
2bc40 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
2bc50 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion: .    **.   
2bc60 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c   **    * The fil
2bc70 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
2bc80 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
2bc90 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
2bca0 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
2bcb0 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
2bcc0 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a  size, and .    *
2bcd0 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d  *    * This comm
2bce0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
2bcf0 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
2bd00 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
2bd10 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63      **    * Exac
2bd20 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
2bd30 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
2bd40 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
2bd50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
2bd60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2bd70 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2bd80 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20  was not enabled 
2bd90 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2bda0 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
2bdb0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2bdc0 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
2bdd0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2bde0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2bdf0 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  nge.    ** count
2be00 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d  er in 'indirect-
2be10 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70  mode'. If the op
2be20 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
2be30 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20  mpiled in but.  
2be40 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c    ** is not appl
2be50 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74  icable to this t
2be60 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c  ransaction, call
2be70 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
2be80 72 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20 74  reate().    ** t
2be90 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
2bea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
2beb0 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63   actually been c
2bec0 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c  reated, then cal
2bed0 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69  l.    ** pager_i
2bee0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2bef0 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2bf00 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2bf10 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20   in indirect.   
2bf20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a   ** mode. .    *
2bf30 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  *.    ** Otherwi
2bf40 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d  se, if the optim
2bf50 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20  ization is both 
2bf60 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c  enabled and appl
2bf70 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74  icable,.    ** t
2bf80 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69  hen call pager_i
2bf90 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2bfa0 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2bfb0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2bfc0 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65  .    ** in 'dire
2bfd0 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ct' mode. In thi
2bfe0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2bff0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
2c000 65 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  er be.    ** cre
2c010 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
2c020 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
2c030 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2c040 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2c050 49 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a 70  ITE.    PgHdr *p
2c060 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
2c070 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2c080 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
2c090 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2c0a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2c0b0 46 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  F );.    if( !zM
2c0c0 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28  aster && isOpen(
2c0d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
2c0e0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2c0f0 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
2c100 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
2c110 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
2c120 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72  ->dbSize>=pPager
2c130 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20  ->dbFileSize.   
2c140 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20    && (0==(pPg = 
2c150 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2c160 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2c170 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70  PCache)) || 0==p
2c180 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20  Pg->pDirty).    
2c190 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ){.      /* Upda
2c1a0 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
2c1b0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
2c1c0 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
2c1d0 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
2c1e0 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
2c1f0 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64  ng call will mod
2c200 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ify the in-memor
2c210 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
2c220 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20 20   of page 1 .    
2c230 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
2c240 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
2c250 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
2c260 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
2c270 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63   .      ** direc
2c280 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
2c290 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73  ase file. Becaus
2c2a0 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
2c2b0 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20  write .      ** 
2c2c0 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
2c2d0 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
2c2e0 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
2c2f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2c300 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2c310 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2c320 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ger, 1);.    }el
2c330 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
2c340 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2c350 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
2c360 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2c370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c380 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2c390 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c3a0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
2c3b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c       }.    }.#el
2c3c0 73 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  se.    rc = page
2c3d0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2c3e0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
2c3f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2c400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2c410 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2c420 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20  e_one_exit;..   
2c430 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
2c440 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
2c450 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
2c460 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
2c470 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65 69  pages.    ** bei
2c480 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
2c490 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
2c4a0 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
2c4b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
2c4c0 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
2c4d0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2c4e0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
2c4f0 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
2c500 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e  ** Before readin
2c510 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68  g the pages with
2c520 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61   page numbers la
2c530 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
2c540 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61     ** current va
2c550 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
2c560 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20  ize, set dbSize 
2c570 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
2c580 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74  e.    ** that it
2c590 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61   took at the sta
2c5a0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
2c5b0 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
2c5c0 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c  , the.    ** cal
2c5d0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2c5e0 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a  erGet() return z
2c5f0 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74  eroed pages inst
2c600 65 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72  ead of .    ** r
2c610 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
2c620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c630 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
2c640 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  * When journal_m
2c650 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f  ode==OFF the dbO
2c660 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79  rigSize is alway
2c670 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a  s zero, so this.
2c680 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76      ** block nev
2c690 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e  er runs if journ
2c6a0 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20  al_mode=OFF..   
2c6b0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2c6c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2c6d0 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
2c6e0 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72  r->dbSize<pPager
2c6f0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
2c700 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 50 61     && ALWAYS(pPa
2c710 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2c720 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2c730 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 29 7b 0a  ODE_OFF).    ){.
2c740 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20        Pgno i;   
2c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c770 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2c780 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  able */.      co
2c790 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d  nst Pgno iSkip =
2c7a0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
2c7b0 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69  Pager); /* Pendi
2c7c0 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a  ng lock page */.
2c7d0 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f        const Pgno
2c7e0 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
2c7f0 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  ->dbSize;       
2c800 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67  /* Database imag
2c810 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20  e size */ .     
2c820 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2c830 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
2c840 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Size;.      for(
2c850 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d   i=dbSize+1; i<=
2c860 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2c870 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
2c880 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
2c890 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
2c8a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
2c8b0 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
2c8c0 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20            PgHdr 
2c8d0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
2c8e0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a      /* Page to j
2c8f0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20  ournal */.      
2c900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c910 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2c920 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
2c930 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2c940 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2c950 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2c960 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
2c970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c980 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a  erWrite(pPage);.
2c990 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c9a0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2c9b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2c9c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c9d0 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2c9e0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2c9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
2ca00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
2ca10 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a  bSize = dbSize;.
2ca20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2ca30 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
2ca40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
2ca50 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
2ca60 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d  nal file. If a m
2ca70 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f  aster .    ** jo
2ca80 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2ca90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2caa0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2cab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20  journal file, . 
2cac0 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73     ** or if zMas
2cad0 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20  ter is NULL (no 
2cae0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c  master journal),
2caf0 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
2cb00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
2cb10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
2cb20 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
2cb30 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
2cb40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cb50 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2cb60 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2cb70 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  xit;..    /* Syn
2cb80 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2cb90 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69  le. If the atomi
2cba0 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
2cbb0 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20  ation is being. 
2cbc0 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73     ** used, this
2cbd0 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63   call will not c
2cbe0 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  reate the journa
2cbf0 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72  l file or perfor
2cc00 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61  m any.    ** rea
2cc10 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  l IO..    */.   
2cc20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
2cc30 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
2cc40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cc50 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2cc60 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2cc70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
2cc80 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2cc90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cca0 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  e. */.    rc = p
2ccb0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2ccc0 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68  ist(sqlite3Pcach
2ccd0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2cce0 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20  r->pPCache));.  
2ccf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cd00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2cd10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2cd20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
2cd30 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  .      goto comm
2cd40 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2cd50 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
2cd60 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
2cd70 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
2cd80 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  he);..    /* If 
2cd90 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
2cda0 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
2cdb0 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74   size as the dat
2cdc0 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20  abase image,.   
2cdd0 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67   ** then use pag
2cde0 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67  er_truncate to g
2cdf0 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68  row or shrink th
2ce00 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  e file here..   
2ce10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
2ce20 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67  er->dbSize!=pPag
2ce30 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2ce40 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65  {.      Pgno nNe
2ce50 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  w = pPager->dbSi
2ce60 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62  ze - (pPager->db
2ce70 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  Size==PAGER_MJ_P
2ce80 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20  GNO(pPager));.  
2ce90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2cea0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2ceb0 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2cec0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
2ced0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
2cee0 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  nNew);.      if(
2cef0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cf00 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2cf10 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
2cf20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c   }..    /* Final
2cf30 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  ly, sync the dat
2cf40 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
2cf50 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2cf60 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e  noSync && !noSyn
2cf70 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
2cf80 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2cf90 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2cfa0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
2cfb0 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
2cfc0 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
2cfd0 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70   pPager))..    p
2cfe0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2cff0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
2d000 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  ..commit_phase_o
2d010 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  ne_exit:.  retur
2d020 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2d030 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
2d040 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
2d050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d060 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  has been complet
2d070 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74  ely.** updated t
2d080 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68  o reflect the ch
2d090 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
2d0a0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
2d0b0 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e  ction and.** syn
2d0c0 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ced to disk. The
2d0d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
2d0e0 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68  ill exists in th
2d0f0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
2d100 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66  * though, and if
2d110 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
2d120 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
2d130 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  it will eventual
2d140 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73  ly.** be used as
2d150 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
2d160 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2d170 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65  ransaction rolle
2d180 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
2d190 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61  is function fina
2d1a0 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
2d1b0 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62  l file, either b
2d1c0 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20  y deleting, .** 
2d1d0 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61  truncating or pa
2d1e0 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20  rtially zeroing 
2d1f0 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63  it, so that it c
2d200 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a  annot be used .*
2d210 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61  * for hot-journa
2d220 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65  l rollback. Once
2d230 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68   this is done th
2d240 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2d250 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20  .** irrevocably 
2d260 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
2d270 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2d280 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
2d290 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2d2a0 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a  d and the pager.
2d2b0 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68  ** moves into th
2d2c0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f  e error state. O
2d2d0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
2d2e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2d2f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2d300 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
2d310 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
2d320 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2d330 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2d340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2d350 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
2d360 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2d370 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2d380 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65  led if a prior e
2d390 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
2d3a0 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28  d..  ** But if (
2d3b0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2d3c0 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20  error elsewhere 
2d3d0 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69  in the system) i
2d3e0 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20  t does get.  ** 
2d3f0 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74  called, just ret
2d400 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
2d410 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20  or code without 
2d420 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
2d430 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2d440 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2d450 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
2d460 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
2d470 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2d480 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
2d490 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
2d4a0 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61  is not in at lea
2d4b0 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45  st.  ** PAGER_RE
2d4c0 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e  SERVED state. An
2d4d0 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20  d indeed SQLite 
2d4e0 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e  never does this.
2d4f0 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20   But it is.  ** 
2d500 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68 69  nice to have thi
2d510 73 20 64 65 66 65 6e 73 69 76 65 20 74 65 73 74  s defensive test
2d520 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20   here anyway..  
2d530 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2d540 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
2d550 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 20 72  ER_RESERVED) ) r
2d560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2d570 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74  OR;..  /* An opt
2d580 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68  imization. If th
2d590 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e  e database was n
2d5a0 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
2d5b0 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a  fied during.  **
2d5c0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2d5d0 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20  n, the pager is 
2d5e0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2d5f0 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73  sive-mode and is
2d600 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73  .  ** using pers
2d610 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c  istent journals,
2d620 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2d630 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2d640 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74    **.  ** The st
2d650 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2d660 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
2d670 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  y contains a sin
2d680 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  gle journal .  *
2d690 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68  * header with th
2d6a0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74  e nRec field set
2d6b0 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61   to 0. If such a
2d6c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64   journal is used
2d6d0 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   as.  ** a hot-j
2d6e0 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f  ournal during ho
2d6f0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2d700 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69  ck, 0 changes wi
2d710 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20  ll be made.  ** 
2d720 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2d730 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69  file. So there i
2d740 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72  s no need to zer
2d750 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  o the journal . 
2d760 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63   ** header. Sinc
2d770 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
2d780 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
2d790 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
2d7a0 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20  ed.  ** to drop 
2d7b0 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72  any locks either
2d7c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
2d7d0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d  ger->dbModified=
2d7e0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  =0 && pPager->ex
2d7f0 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
2d800 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
2d810 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2d820 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2d830 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  T.  ){.    asser
2d840 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
2d850 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
2d860 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
2d870 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d880 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41  TE_OK;.  }..  PA
2d890 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49  GERTRACE(("COMMI
2d8a0 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
2d8b0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
2d8c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2d8d0 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
2d8e0 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70  D || MEMDB || !p
2d8f0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2d900 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  d );.  rc = page
2d910 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
2d920 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
2d930 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
2d940 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2d950 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2d960 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
2d970 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54  k all changes. T
2d980 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
2d990 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
2d9a0 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a  SHARED mode..**.
2d9b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2d9c0 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61   performs two ta
2d9d0 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  sks:.**.**   1) 
2d9e0 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  It rolls back th
2d9f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2da00 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61  restoring all da
2da10 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2da20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f  .**      in-memo
2da30 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74  ry cache pages t
2da40 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79  o the state they
2da50 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68   were in when th
2da60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
2da70 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64        was opened
2da80 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74  , and.**   2) It
2da90 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a   finalizes the j
2daa0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20  ournal file, so 
2dab0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75  that it is not u
2dac0 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20  sed for hot.**  
2dad0 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20      rollback at 
2dae0 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  any point in the
2daf0 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73   future..**.** s
2db00 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
2db10 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63  llowing qualific
2db20 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20  ations:.**.** * 
2db30 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
2db40 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  ile is not yet o
2db50 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
2db60 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2db70 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79  ,.**   then only
2db80 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (2) is performe
2db90 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
2dba0 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72  there is no jour
2dbb0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f  nal file.**   to
2dbc0 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a   roll back..**.*
2dbd0 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72  * * If in an err
2dbe0 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
2dbf0 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  han SQLITE_FULL,
2dc00 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69   then task (1) i
2dc10 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65  s .**   performe
2dc20 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  d. If successful
2dc30 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61  , task (2). Rega
2dc40 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
2dc50 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69  tcome.**   of ei
2dc60 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20  ther, the error 
2dc70 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
2dc80 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
2dc90 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  the caller.**   
2dca0 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c  (i.e. either SQL
2dcb0 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
2dcc0 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
2dcd0 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67  .** * If the pag
2dce0 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52  er is in PAGER_R
2dcf0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
2dd00 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e  hen attempt (1).
2dd10 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72   Whether.**   or
2dd20 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63   not (1) is succ
2dd30 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74  ussful, also att
2dd40 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63  empt (2). If suc
2dd50 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
2dd60 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  **   SQLITE_OK. 
2dd70 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72  Otherwise, enter
2dd80 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2dd90 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
2dda0 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f  first .**   erro
2ddb0 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72  r code encounter
2ddc0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ed. .**.**   In 
2ddd0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2dde0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
2ddf0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  t the database w
2de00 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a  as written to. .
2de10 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20  **   So is safe 
2de20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
2de30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65  journal file eve
2de40 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63  n if the playbac
2de50 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69  k .**   (operati
2de60 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f  on 1) failed. Ho
2de70 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20  wever the pager 
2de80 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65  must enter the e
2de90 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20  rror state.**   
2dea0 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  as the contents 
2deb0 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
2dec0 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73   cache are now s
2ded0 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20  uspect..**.** * 
2dee0 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50  Finally, if in P
2def0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73  AGER_EXCLUSIVE s
2df00 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d  tate, then attem
2df10 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20  pt (1). Only.** 
2df20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66    attempt (2) if
2df30 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66   (1) is successf
2df40 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ul. Return SQLIT
2df50 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2df60 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69  ul,.**   otherwi
2df70 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  se enter the err
2df80 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
2df90 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
2dfa0 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  de from the .** 
2dfb0 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74    failing operat
2dfc0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ion..**.**   In 
2dfd0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61  this case the da
2dfe0 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20  tabase file may 
2dff0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
2e000 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a  n to. So if the.
2e010 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70  **   playback op
2e020 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
2e030 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64  succeed it would
2e040 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20   not be safe to 
2e050 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68  finalize.**   th
2e060 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2e070 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  It needs to be l
2e080 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
2e090 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a  system so that.*
2e0a0 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  *   some other p
2e0b0 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69  rocess can use i
2e0c0 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  t to restore the
2e0d0 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20   database state 
2e0e0 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75  (by.**   hot-jou
2e0f0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
2e100 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e110 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
2e120 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2e130 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e150 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2e160 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43  e */.  PAGERTRAC
2e170 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E(("ROLLBACK %d\
2e180 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2e190 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70 50  er)));.  if( !pP
2e1a0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2e1b0 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
2e1c0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2e1d0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
2e1e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2e1f0 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2e200 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ster);.  }else i
2e210 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
2e220 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
2e230 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
2e240 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
2e250 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2e260 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
2e270 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
2e280 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
2e290 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2e2a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2e2b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2e2c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
2e2d0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2e2e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
2e2f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2e300 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2e310 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  er, 0);.      rc
2e320 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
2e330 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2e340 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2e350 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
2e360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e370 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
2e380 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
2e390 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2e3a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e3b0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2e3c0 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
2e3d0 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
2e3e0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
2e3f0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
2e400 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2e410 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
2e420 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
2e430 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
2e440 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
2e450 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
2e460 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
2e470 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
2e480 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
2e490 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
2e4a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2e4b0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
2e4c0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
2e4d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e4e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2e4f0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2e500 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
2e510 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
2e520 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
2e530 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
2e540 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
2e550 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  ble..*/.u8 sqlit
2e560 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
2e570 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
2e580 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2e590 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
2e5a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2e5b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2e5c0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2e5d0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2e5e0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
2e5f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e600 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e610 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
2e620 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2e630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e640 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2e650 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2e660 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
2e670 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2e680 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
2e690 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b  (DbPage *pPage){
2e6a0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e6b0 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
2e6c0 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23  unt(pPage);.}..#
2e6d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2e6e0 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
2e6f0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
2e700 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
2e710 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
2e720 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  nt *sqlite3Pager
2e730 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  Stats(Pager *pPa
2e740 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
2e750 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
2e760 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2e770 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2e780 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31  >pPCache);.  a[1
2e790 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2e7a0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
2e7b0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2e7c0 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [2] = sqlite3Pca
2e7d0 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28  cheGetCachesize(
2e7e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e7f0 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
2e800 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f  r->dbSizeValid ?
2e810 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64   (int) pPager->d
2e820 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b  bSize : -1;.  a[
2e830 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
2e840 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
2e850 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2e860 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
2e870 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
2e880 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
2e890 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
2e8a0 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
2e8b0 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
2e8c0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
2e8d0 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
2e8e0 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
2e8f0 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
2e900 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2e910 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2e920 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
2e930 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e940 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67  PagerIsMemdb(Pag
2e950 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2e960 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a  eturn MEMDB;.}..
2e970 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
2e980 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65   there are at le
2e990 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73  ast nSavepoint s
2e9a0 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20  avepoints open. 
2e9b0 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  If there are.** 
2e9c0 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74  currently less t
2e9d0 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20  han nSavepoints 
2e9e0 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20  open, then open 
2e9f0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
2ea00 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b  points.** to mak
2ea10 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65  e up the differe
2ea20 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62  nce. If the numb
2ea30 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
2ea40 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65   is already.** e
2ea50 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69  qual to nSavepoi
2ea60 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  nt, then this fu
2ea70 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2ea80 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  p..**.** If a me
2ea90 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2eaa0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
2eab0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
2eac0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   If an error .**
2ead0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
2eae0 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f  ening the sub-jo
2eaf0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
2eb00 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2eb10 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  e is.** returned
2eb20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
2eb30 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
2eb40 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
2eb50 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
2eb60 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76  pPager, int nSav
2eb70 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
2eb80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eba0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2ebb0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ode */.  int nCu
2ebc0 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  rrent = pPager->
2ebd0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20  nSavepoint;     
2ebe0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75     /* Current nu
2ebf0 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
2ec00 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61  ts */..  if( nSa
2ec10 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74  vepoint>nCurrent
2ec20 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
2ec30 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
2ec40 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec60 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2ec70 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
2ec80 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
2ec90 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *aNew;         
2eca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2ecb0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
2ecc0 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 20 20  t array */..    
2ecd0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72 65 20  /* Either there 
2ece0 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a 6f 75  is no active jou
2ecf0 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75 62 2d  rnal or the sub-
2ed00 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2ed10 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a  or .    ** the j
2ed20 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79 73  ournal is always
2ed30 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
2ed40 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  y */.    assert(
2ed50 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2ed60 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70 65 6e  int==0 || isOpen
2ed70 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
2ed80 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  |.            pP
2ed90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2eda0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2edb0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a  MODE_MEMORY );..
2edc0 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
2edd0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
2ede0 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61   array using rea
2edf0 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53  lloc(). Return S
2ee00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20  QLITE_NOMEM.    
2ee10 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  ** if the alloca
2ee20 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65  tion fails. Othe
2ee30 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20  rwise, zero the 
2ee40 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63  new portion in c
2ee50 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61  ase a .    ** ma
2ee60 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
2ee70 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61  urs while popula
2ee80 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66  ting it in the f
2ee90 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c  or(...) loop bel
2eea0 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
2eeb0 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65  New = (PagerSave
2eec0 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52  point *)sqlite3R
2eed0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
2eee0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2eef0 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72  nt, sizeof(Pager
2ef00 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65  Savepoint)*nSave
2ef10 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20  point.    );.   
2ef20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
2ef30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ef40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2ef50 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b     memset(&aNew[
2ef60 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e  nCurrent], 0, (n
2ef70 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65  Savepoint-nCurre
2ef80 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67  nt) * sizeof(Pag
2ef90 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20  erSavepoint));. 
2efa0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
2efb0 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20  point = aNew;.  
2efc0 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
2efd0 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e  oint = nSavepoin
2efe0 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  t;..    /* Popul
2eff0 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61 76  ate the PagerSav
2f000 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
2f010 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64  s just allocated
2f020 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d  . */.    for(ii=
2f030 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61  nCurrent; ii<nSa
2f040 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
2f050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2f060 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2f070 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b  d );.      aNew[
2f080 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67  ii].nOrig = pPag
2f090 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2f0a0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
2f0b0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 41 4c 57  ger->jfd) && ALW
2f0c0 41 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  AYS(pPager->jour
2f0d0 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20  nalOff>0) ){.   
2f0e0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
2f0f0 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
2f100 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
2f110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f120 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
2f130 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
2f140 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
2f150 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
2f160 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
2f170 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20  ger->nSubRec;.  
2f180 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e      aNew[ii].pIn
2f190 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69  Savepoint = sqli
2f1a0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
2f1b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
2f1c0 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77  .      if( !aNew
2f1d0 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2f1e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  t ){.        ret
2f1f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2f200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f210 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
2f220 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
2f230 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2f240 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  dy opened. */.  
2f250 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
2f260 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2f270 20 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74     assertTruncat
2f280 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
2f290 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  er);.  }..  retu
2f2a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f2b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2f2c0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
2f2d0 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28  ack or release (
2f2e0 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f  commit) a savepo
2f2f0 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65  int..** The save
2f300 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65  point to release
2f310 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
2f320 64 20 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73  d not be the mos
2f330 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63  t recently .** c
2f340 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74  reated savepoint
2f350 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
2f360 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65  r op is always e
2f370 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
2f380 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45  ROLLBACK or SAVE
2f390 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a  POINT_RELEASE..*
2f3a0 2a 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  * If it is SAVEP
2f3b0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
2f3c0 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64  en release and d
2f3d0 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70  estroy the savep
2f3e0 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64  oint with.** ind
2f3f0 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49  ex iSavepoint. I
2f400 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
2f410 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
2f420 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   rollback all ch
2f430 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61  anges.** that ha
2f440 76 65 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63  ve occurred sinc
2f450 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
2f460 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72  savepoint was cr
2f470 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eated..**.** The
2f480 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f   savepoint to ro
2f490 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
2f4a0 65 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  e is identified 
2f4b0 62 79 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a  by parameter .**
2f4c0 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76   iSavepoint. A v
2f4d0 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20  alue of 0 means 
2f4e0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
2f4f0 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
2f500 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69  point.** (the fi
2f510 72 73 74 20 63 72 65 61 74 65 64 29 2e 20 41 20  rst created). A 
2f520 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e  value of (Pager.
2f530 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65  nSavepoint-1) me
2f540 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f  ans operate.** o
2f550 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
2f560 74 6c 79 20 63 72 65 61 74 65 64 20 73 61 76 65  tly created save
2f570 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70  point. If iSavep
2f580 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
2f590 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e  than.** (Pager.n
2f5a0 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68  Savepoint-1), th
2f5b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2f5c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2f5d0 2a 2a 20 49 66 20 61 20 6e 65 67 61 74 69 76 65  ** If a negative
2f5e0 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
2f5f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2f600 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72  n, then the curr
2f610 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
2f620 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
2f630 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
2f640 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rent to calling 
2f650 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2f660 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75  Rollback() becau
2f670 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2f680 20 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e   does not termin
2f690 61 74 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73  ate.** the trans
2f6a0 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b  action or unlock
2f6b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
2f6c0 74 20 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20  t just restores 
2f6d0 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
2f6e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f6f0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
2f700 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49   state. .**.** I
2f710 6e 20 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20  n any case, all 
2f720 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20  savepoints with 
2f730 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
2f740 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74   than iSavepoint
2f750 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79   .** are destroy
2f760 65 64 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ed. If this is a
2f770 20 72 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69   release operati
2f780 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  on (op==SAVEPOIN
2f790 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74  T_RELEASE),.** t
2f7a0 68 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53  hen savepoint iS
2f7b0 61 76 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f  avepoint is also
2f7c0 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
2f7d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2f7e0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2f7f0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d  E_NOMEM if a mem
2f800 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
2f810 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49  ails,.** or an I
2f820 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
2f830 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2f840 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  rs while rolling
2f850 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65   back a .** save
2f860 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72  point. If no err
2f870 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  ors occur, SQLIT
2f880 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2f890 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
2f8a0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
2f8b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2f8c0 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
2f8d0 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
2f8e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2f8f0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
2f900 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
2f910 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
2f920 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73  ROLLBACK );.  as
2f930 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
2f940 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  >=0 || op==SAVEP
2f950 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
2f960 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f 69  ..  if( iSavepoi
2f970 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  nt<pPager->nSave
2f980 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  point ){.    int
2f990 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
2f9a0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2f9b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
2f9c0 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f  nNew;          /
2f9d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61  * Number of rema
2f9e0 69 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73  ining savepoints
2f9f0 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20   after this op. 
2fa00 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  */..    /* Figur
2fa10 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73  e out how many s
2fa20 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73  avepoints will s
2fa30 74 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61  till be active a
2fa40 66 74 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a  fter this.    **
2fa50 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72   operation. Stor
2fa60 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20  e this value in 
2fa70 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20  nNew. Then free 
2fa80 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69  resources associ
2fa90 61 74 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74  ated .    ** wit
2faa0 68 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  h any savepoints
2fab0 20 74 68 61 74 20 61 72 65 20 64 65 73 74 72 6f   that are destro
2fac0 79 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  yed by this oper
2fad0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
2fae0 20 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f    nNew = iSavepo
2faf0 69 6e 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56  int + (( op==SAV
2fb00 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
2fb10 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20 20 20 66   ? 0 : 1);.    f
2fb20 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70  or(ii=nNew; ii<p
2fb30 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2fb40 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t; ii++){.      
2fb50 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
2fb60 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
2fb70 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
2fb80 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
2fb90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
2fba0 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a  vepoint = nNew;.
2fbb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2fbc0 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20  is a release of 
2fbd0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  the outermost sa
2fbe0 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74  vepoint, truncat
2fbf0 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  e .    ** the su
2fc00 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72  b-journal to zer
2fc10 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
2fc20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d   */.    if( op==
2fc30 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2fc40 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  E ){.      if( n
2fc50 4e 65 77 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e  New==0 && isOpen
2fc60 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
2fc70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c  {.        /* Onl
2fc80 79 20 74 72 75 6e 63 61 74 65 20 69 66 20 69 74  y truncate if it
2fc90 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2fca0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
2fcb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2fcc0 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
2fcd0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
2fce0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2fcf0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
2fd00 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
2fd10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61   0);.          a
2fd20 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2fd30 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
2fd40 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
2fd50 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20  ->nSubRec = 0;. 
2fd60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2fd70 20 2f 2a 20 45 6c 73 65 20 74 68 69 73 20 69 73   /* Else this is
2fd80 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72   a rollback oper
2fd90 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20  ation, playback 
2fda0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61  the specified sa
2fdb0 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20  vepoint..    ** 
2fdc0 49 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  If this is a tem
2fdd0 70 2d 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f  p-file, it is po
2fde0 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 20  ssible that the 
2fdf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
2fe00 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20  .    ** not yet 
2fe10 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20  been opened. In 
2fe20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2fe30 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61  have been no cha
2fe40 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74  nges to.    ** t
2fe50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fe60 2c 20 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63  , so the playbac
2fe70 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20  k operation can 
2fe80 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  be skipped..    
2fe90 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
2fea0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2feb0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  fd) ){.      Pag
2fec0 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
2fed0 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d  vepoint = (nNew=
2fee0 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61  =0)?0:&pPager->a
2fef0 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31  Savepoint[nNew-1
2ff00 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ];.      rc = pa
2ff10 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
2ff20 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61  oint(pPager, pSa
2ff30 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
2ff40 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54  assert(rc!=SQLIT
2ff50 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20  E_DONE);.    }. 
2ff60 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
2ff70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2ff80 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
2ff90 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
2ffa0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
2ffb0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
2ffc0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
2ffd0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2ffe0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2fff0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
30000 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
30010 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
30020 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
30030 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
30040 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
30050 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
30060 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
30070 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
30080 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
30090 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
300a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
300b0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
300c0 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
300d0 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
300e0 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
300f0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
30100 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
30110 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
30120 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
30130 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
30140 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
30150 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
30160 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
30170 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
30180 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
30190 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
301a0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
301b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
301c0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
301d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
301e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
301f0 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
30200 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
30210 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
30220 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
30230 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
30240 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
30250 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
30260 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
30270 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30280 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
30290 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
302a0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
302b0 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72  C./*.** Set or r
302c0 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 64 65  etrieve the code
302d0 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
302e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
302f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
30300 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
30310 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
30320 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
30330 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
30340 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
30350 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
30360 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  nt,int),.  void 
30370 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f  (*xCodecFree)(vo
30380 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  id*),.  void *pC
30390 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50  odec.){.  if( pP
303a0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
303b0 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
303c0 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
303d0 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d  odec);.  pPager-
303e0 3e 78 43 6f 64 65 63 20 3d 20 70 50 61 67 65 72  >xCodec = pPager
303f0 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78 43  ->memDb ? 0 : xC
30400 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
30410 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 3d  xCodecSizeChng =
30420 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b   xCodecSizeChng;
30430 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
30440 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46 72  cFree = xCodecFr
30450 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ee;.  pPager->pC
30460 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20  odec = pCodec;. 
30470 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
30480 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74  (pPager);.}.stat
30490 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  ic void *sqlite3
304a0 50 61 67 65 72 47 65 74 43 6f 64 65 63 28 50 61  PagerGetCodec(Pa
304b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
304c0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
304d0 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Codec;.}.#endif.
304e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
304f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
30500 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
30510 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74  age pPg to locat
30520 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
30530 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  file..**.** Ther
30540 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
30550 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
30560 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
30570 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e  ocated at.** pgn
30580 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c  o (which we call
30590 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20   pPgOld) though 
305a0 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c  that page is all
305b0 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  owed to be.** in
305c0 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20   cache.  If the 
305d0 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
305e0 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20  located at pgno 
305f0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
30600 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  * in the rollbac
30610 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
30620 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62   not put there b
30630 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  y by this routin
30640 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
30650 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
30660 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  pPg remain valid
30670 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
30680 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
30690 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20  ciated with pPg 
306a0 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
306b0 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
306c0 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
306d0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
306e0 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
306f0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
30700 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
30710 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
30720 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
30730 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
30740 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
30750 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
30760 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
30770 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
30780 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
30790 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
307a0 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
307b0 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
307c0 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
307d0 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
307e0 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
307f0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
30800 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a  is active)..**.*
30810 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20  * If the fourth 
30820 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d  argument, isComm
30830 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  it, is non-zero,
30840 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
30850 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65  is being.** move
30860 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64  d as part of a d
30870 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69  atabase reorgani
30880 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f  zation just befo
30890 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
308a0 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20  on .** is being 
308b0 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68  committed. In th
308c0 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67  is case, it is g
308d0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
308e0 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
308f0 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20   .** pPg refers 
30900 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77  to will not be w
30910 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20  ritten to again 
30920 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
30930 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
30940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
30950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
30960 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
30970 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
30980 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
30990 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 65  Otherwise, it re
309a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
309b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
309c0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67  agerMovepage(Pag
309d0 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61  er *pPager, DbPa
309e0 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  ge *pPg, Pgno pg
309f0 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  no, int isCommit
30a00 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f  ){.  PgHdr *pPgO
30a10 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
30a20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65    /* The page be
30a30 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
30a40 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   */.  Pgno needS
30a50 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20  yncPgno = 0;    
30a60 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20     /* Old value 
30a70 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66  of pPg->pgno, if
30a80 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
30a90 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  d */.  int rc;  
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ab0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30ac0 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69  de */.  Pgno ori
30ad0 67 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  gPgno;          
30ae0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67       /* The orig
30af0 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  inal page number
30b00 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
30b10 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
30b20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   /* In order to 
30b30 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
30b40 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ack, an in-memor
30b50 79 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  y database must 
30b60 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 74 68 65  journal.  ** the
30b70 20 70 61 67 65 20 77 65 20 61 72 65 20 6d 6f 76   page we are mov
30b80 69 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20  ing from..  */. 
30b90 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
30ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30bb0 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
30bc0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
30bd0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
30be0 20 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69   If the page bei
30bf0 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74  ng moved is dirt
30c00 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65  y and has not be
30c10 65 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20  en saved by the 
30c20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65  latest.  ** save
30c30 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65  point, then save
30c40 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
30c50 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
30c60 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a  e into the .  **
30c70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77   sub-journal now
30c80 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
30c90 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
30ca0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
30cb0 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rio:.  **.  **  
30cc0 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20   BEGIN;.  **    
30cd0 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
30ce0 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74  , then modify it
30cf0 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a   in memory>.  **
30d00 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
30d10 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  ne;.  **       <
30d20 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c  Move page X to l
30d30 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20  ocation Y>.  ** 
30d40 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
30d50 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  one;.  **.  ** I
30d60 66 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f  f page X were no
30d70 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
30d80 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72   sub-journal her
30d90 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
30da0 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
30db0 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20   to restore its 
30dc0 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68  contents when th
30dd0 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f  e "ROLLBACK TO o
30de0 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ne".  ** stateme
30df0 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65  nt were is proce
30e00 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ssed..  **.  ** 
30e10 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29  subjournalPage()
30e20 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c   may need to all
30e30 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73  ocate space to s
30e40 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69  tore pPg->pgno i
30e50 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20  nto.  ** one or 
30e60 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62  more savepoint b
30e70 69 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20  itvecs. This is 
30e80 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20  the reason this 
30e90 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61  function.  ** ma
30ea0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
30eb0 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66  NOMEM..  */.  if
30ec0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
30ed0 44 52 5f 44 49 52 54 59 0a 20 20 20 26 26 20 73  DR_DIRTY.   && s
30ee0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
30ef0 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54  pPg).   && SQLIT
30f00 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a  E_OK!=(rc = subj
30f10 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29  ournalPage(pPg))
30f20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
30f30 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45   rc;.  }..  PAGE
30f40 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64  RTRACE(("MOVE %d
30f50 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
30f60 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
30f70 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
30f80 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
30f90 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e  Pg->pgno, (pPg->
30fa0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
30fb0 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f  _SYNC)?1:0, pgno
30fc0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
30fd0 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
30fe0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
30ff0 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f  gno, pgno))..  /
31000 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
31010 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
31020 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67  c()ed before pag
31030 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a  e pPg->pgno can.
31040 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
31050 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70  to, store pPg->p
31060 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  gno in local var
31070 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67  iable needSyncPg
31080 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  no..  **.  ** If
31090 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   the isCommit fl
310a0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65  ag is set, there
310b0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
310c0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a  emember that.  *
310d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
310e0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
310f0 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
31100 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  se page pPg->pgn
31110 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77  o .  ** can be w
31120 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
31130 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
31140 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
31150 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20  o write to it.. 
31160 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e   */.  if( (pPg->
31170 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
31180 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d  _SYNC) && !isCom
31190 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  mit ){.    needS
311a0 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
311b0 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
311c0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
311d0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
311e0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
311f0 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
31200 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
31210 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20  HDR_DIRTY );.   
31220 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31230 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
31240 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
31250 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
31260 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
31270 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
31280 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
31290 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
312a0 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
312b0 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
312c0 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
312d0 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
312e0 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
312f0 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
31300 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
31310 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
31320 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
31330 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d  .  pPg->flags &=
31340 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e   ~PGHDR_NEED_SYN
31350 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  C;.  pPgOld = pa
31360 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
31370 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
31380 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70  rt( !pPgOld || p
31390 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29  PgOld->nRef==1 )
313a0 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
313b0 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  {.    pPg->flags
313c0 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61   |= (pPgOld->fla
313d0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
313e0 4e 43 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  NC);.    if( MEM
313f0 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  DB ){.      /* D
31400 6f 20 6e 6f 74 20 64 69 73 63 61 72 64 20 70 61  o not discard pa
31410 67 65 73 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d  ges from an in-m
31420 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
31430 69 6e 63 65 20 77 65 20 6d 69 67 68 74 0a 20 20  ince we might.  
31440 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 72      ** need to r
31450 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72 2e 20 20  ollback later.  
31460 4a 75 73 74 20 6d 6f 76 65 20 74 68 65 20 70 61  Just move the pa
31470 67 65 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61  ge out of the wa
31480 79 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  y. */.      asse
31490 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
314a0 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20  zeValid );.     
314b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f   sqlite3PcacheMo
314c0 76 65 28 70 50 67 4f 6c 64 2c 20 70 50 61 67 65  ve(pPgOld, pPage
314d0 72 2d 3e 64 62 53 69 7a 65 2b 31 29 3b 0a 20 20  r->dbSize+1);.  
314e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
314f0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
31500 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  (pPgOld);.    }.
31510 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20    }..  origPgno 
31520 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73  = pPg->pgno;.  s
31530 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65  qlite3PcacheMove
31540 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73  (pPg, pgno);.  s
31550 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
31560 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
31570 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
31580 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
31590 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
315a0 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
315b0 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
315c0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
315d0 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
315e0 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
315f0 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
31600 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
31610 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
31620 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
31630 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
31640 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
31650 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
31660 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
31670 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a  he .    ** "is j
31680 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63  ournaled" bitvec
31690 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73   flag has been s
316a0 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74  et. This needs t
316b0 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79  o be remedied by
316c0 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20  .    ** loading 
316d0 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
316e0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
316f0 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  d setting the Pg
31700 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20  Hdr.needSync .  
31710 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a    ** flag..    *
31720 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
31730 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
31740 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
31750 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69  e page-cache fai
31760 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20  ls, (due.    ** 
31770 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  to a malloc() or
31780 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c   IO failure), cl
31790 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74  ear the bit in t
317a0 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a  he pInJournal[].
317b0 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74      ** array. Ot
317c0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
317d0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61  page is loaded a
317e0 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e  nd written again
317f0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   in.    ** this 
31800 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
31810 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74  may be written t
31820 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
31830 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ile before.    *
31840 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69  * it is synced i
31850 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
31860 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20  file. This way, 
31870 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e  it may end up in
31880 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
31890 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20  nal file twice, 
318a0 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  but that is not 
318b0 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a  a problem..    *
318c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
318d0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63  ite3PagerGet() c
318e0 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68  all may cause th
318f0 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e  e journal to syn
31900 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  c. So make.    *
31910 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72  * sure the Pager
31920 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
31930 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a  s set too..    *
31940 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  /.    PgHdr *pPg
31950 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Hdr;.    assert(
31960 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
31970 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
31980 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
31990 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
319a0 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20  no, &pPgHdr);.  
319b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
319c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
319d0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70   needSyncPgno<=p
319e0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
319f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
31a00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 54 6d  ert( pPager->pTm
31a10 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20 20 20  pSpace!=0 );.   
31a20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
31a30 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  ecClear(pPager->
31a40 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64  pInJournal, need
31a50 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65 72  SyncPgno, pPager
31a60 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
31a70 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
31a80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
31a90 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
31aa0 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72  c = 1;.    asser
31ab0 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  t( pPager->noSyn
31ac0 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29  c==0 && !MEMDB )
31ad0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c  ;.    pPgHdr->fl
31ae0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
31af0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69  D_SYNC;.    sqli
31b00 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
31b10 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
31b20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
31b30 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
31b40 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e    /*.  ** For an
31b50 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
31b60 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ase, make sure t
31b70 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
31b80 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20   continues.  ** 
31b90 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73  to exist, in cas
31ba0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
31bb0 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20  n needs to roll 
31bc0 62 61 63 6b 2e 20 20 55 73 65 20 70 50 67 4f 6c  back.  Use pPgOl
31bd0 64 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 6f 72  d.  ** as the or
31be0 69 67 69 6e 61 6c 20 70 61 67 65 20 73 69 6e 63  iginal page sinc
31bf0 65 20 69 74 20 68 61 73 20 61 6c 72 65 61 64 79  e it has already
31c00 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e   been allocated.
31c10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
31c20 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  B ){.    sqlite3
31c30 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c  PcacheMove(pPgOl
31c40 64 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20  d, origPgno);.  
31c50 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
31c60 72 65 66 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d  ref(pPgOld);.  }
31c70 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
31c80 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
31c90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
31ca0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
31cb0 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
31cc0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
31cd0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
31ce0 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
31cf0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
31d00 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  pPg->nRef>0 || p
31d10 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44  Pg->pPager->memD
31d20 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  b );.  return pP
31d30 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a  g->pData;.}../*.
31d40 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
31d50 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
31d60 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
31d70 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
31d80 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
31d90 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
31da0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
31db0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
31dc0 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
31dd0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
31de0 20 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a   pPg->pExtra;.}.
31df0 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
31e00 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
31e10 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
31e20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
31e30 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f  must be one.** o
31e40 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  f PAGER_LOCKINGM
31e50 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52  ODE_QUERY, PAGER
31e60 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
31e70 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52  MAL or .** PAGER
31e80 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
31e90 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70  LUSIVE. If the p
31ea0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
31eb0 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
31ec0 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
31ed0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
31ee0 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
31ef0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
31f00 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
31f10 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  er PAGER_LOCKING
31f20 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a  MODE_NORMAL or.*
31f30 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
31f40 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69  ODE_EXCLUSIVE, i
31f50 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75  ndicating the cu
31f60 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
31f70 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b  updated).** lock
31f80 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ing-mode..*/.int
31f90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
31fa0 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a  kingMode(Pager *
31fb0 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
31fc0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
31fd0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
31fe0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  NGMODE_QUERY.   
31ff0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32000 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
32010 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  MODE_NORMAL.    
32020 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
32030 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
32040 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
32050 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
32060 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
32070 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
32080 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
32090 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26  ODE_NORMAL>=0 &&
320a0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
320b0 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20  DE_EXCLUSIVE>=0 
320c0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
320d0 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  0 && !pPager->te
320e0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
320f0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
32100 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
32110 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
32120 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  nt)pPager->exclu
32130 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  siveMode;.}../*.
32140 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a  ** Get/set the j
32150 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20  ournal-mode for 
32160 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
32170 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
32180 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a   be one of:.**.*
32190 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
321a0 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20  ALMODE_QUERY.** 
321b0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
321c0 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20  MODE_DELETE.**  
321d0 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
321e0 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20  ODE_TRUNCATE.** 
321f0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
32200 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20  MODE_PERSIST.** 
32210 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
32220 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50  MODE_OFF.**    P
32230 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32240 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66  _MEMORY.**.** If
32250 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
32260 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
32270 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d  en the journal_m
32280 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
32290 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69  e.** value speci
322a0 66 69 65 64 20 69 66 20 74 68 65 20 63 68 61 6e  fied if the chan
322b0 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20  ge is allowed.  
322c0 54 68 65 20 63 68 61 6e 67 65 20 69 73 20 64 69  The change is di
322d0 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20  sallowed.** for 
322e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  the following re
322f0 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  asons:.**.**   *
32300 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    An in-memory d
32310 61 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79  atabase can only
32320 20 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61   have its journa
32330 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f  l_mode set to _O
32340 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d  FF.**      or _M
32350 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  EMORY..**.**   *
32360 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f    The journal mo
32370 64 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68  de may not be ch
32380 61 6e 67 65 64 20 77 68 69 6c 65 20 61 20 74 72  anged while a tr
32390 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
323a0 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ive..**.** The r
323b0 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65  eturned indicate
323c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
323d0 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 20  ssibly updated) 
323e0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f  journal-mode..*/
323f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
32400 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67  rJournalMode(Pag
32410 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
32420 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
32430 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
32440 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
32450 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
32460 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
32470 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
32480 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
32490 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
324a0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
324b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
324c0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
324d0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
324e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
324f0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
32500 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
32510 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32520 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32530 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
32540 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
32550 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
32560 59 3c 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  Y<0 );.  if( eMo
32570 64 65 3e 3d 30 0a 20 20 20 26 26 20 28 21 4d 45  de>=0.   && (!ME
32580 4d 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41  MDB || eMode==PA
32590 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
325a0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
325b0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
325c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
325d0 45 5f 4f 46 46 29 0a 20 20 20 26 26 20 21 70 50  E_OFF).   && !pP
325e0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
325f0 0a 20 20 20 26 26 20 28 21 69 73 4f 70 65 6e 28  .   && (!isOpen(
32600 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
32610 30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  0==pPager->journ
32620 61 6c 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20 20  alOff).  ){.    
32630 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
32640 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
32650 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
32660 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
32670 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
32680 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75  journalMode = (u
32690 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  8)eMode;.  }.  r
326a0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
326b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
326c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
326d0 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
326e0 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
326f0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
32700 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67  s..**.** Setting
32710 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20   the size limit 
32720 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c  to -1 means no l
32730 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64  imit is enforced
32740 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20  ..** An attempt 
32750 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73  to set a limit s
32760 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69  maller than -1 i
32770 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36  s a no-op..*/.i6
32780 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  4 sqlite3PagerJo
32790 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50  urnalSizeLimit(P
327a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36  ager *pPager, i6
327b0 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28  4 iLimit){.  if(
327c0 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20   iLimit>=-1 ){. 
327d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
327e0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c  alSizeLimit = iL
327f0 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
32800 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  rn pPager->journ
32810 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a  alSizeLimit;.}..
32820 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
32830 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50  ointer to the pP
32840 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61  ager->pBackup va
32850 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b  riable. The back
32860 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20  up module.** in 
32870 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69  backup.c maintai
32880 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ns the content o
32890 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e  f this variable.
328a0 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20   This module.** 
328b0 75 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79  uses it opaquely
328c0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
328d0 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  to sqlite3Backup
328e0 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a  Restart() and.**
328f0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
32900 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a  date() only..*/.
32910 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
32920 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42 61 63  *sqlite3PagerBac
32930 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a 70 50  kupPtr(Pager *pP
32940 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
32950 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  &pPager->pBackup
32960 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
32970 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
32980 4f 20 2a 2f 0a                                   O */.