/ Hex Artifact Content
Login

Artifact d9f426234c8fe92f3ce57126e14766a654a20690:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61  Int.h"../*.** Ma
0370: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
0380: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
0390: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
03a0: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
03b0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
03c0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
03d0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
03e0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
03f0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
0400: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
0410: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
0420: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
0430: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
0440: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
0450: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
0460: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
0470: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0480: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
0490: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
04a0: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
04b0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
04c0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
04d0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
04e0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
04f0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
0500: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
0510: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
0520: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0530: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
0540: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
0550: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
0560: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
0570: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
0580: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
0590: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
05a0: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
05b0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
05c0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
05d0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
05e0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
05f0: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0600: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0620: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0630: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0640: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0650: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
0660: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
0670: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0680: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
0690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06a0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
06b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
06c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
06d0: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
06e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
06f0: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0710: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0720: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0730: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0740: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0750: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0770: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
0780: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
0790: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
07c0: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
07d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0800: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0810: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0820: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0830: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0840: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0850: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
0880: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
0890: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
08a0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
08d0: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
08e0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
08f0: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0910: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0920: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0930: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
0960: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
0970: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
0980: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0990: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
09a0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
09b0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
09c0: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
09d0: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
09e0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0a10: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0a20: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0a30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a40: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0a50: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0a60: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0a70: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0a90: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0aa0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0ab0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0ac0: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0ad0: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0ae0: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0af0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0b00: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0b10: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0b20: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0b30: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b60: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0b70: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0b80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0ba0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0bb0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0bc0: 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ove or.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
0bf0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68  rnal file and th
0c00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
0c10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c20: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20          will be 
0c30: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0c40: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0c50: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0c60: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0c70: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0c80: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
0c90: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61   occurs, the sta
0ca0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0cb0: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
0cc0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
0cd0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
0ce0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0cf0: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0d00: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0d10: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0d20: 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  o PAGER_UNLOCK. 
0d30: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   The first time.
0d40: 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 50  ** that sqlite3P
0d50: 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
0d60: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0d70: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0d80: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0d90: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0da0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
0db0: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0dc0: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0dd0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0de0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0df0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0e00: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0e10: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0e20: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e30: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0e40: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0e50: 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  D means that the
0e60: 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f  re is an open ro
0e70: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
0e80: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0e90: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0ea0: 53 49 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f  SIVE occurs befo
0eb0: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a  re any changes.*
0ec0: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  * are made to th
0ed0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
0ee0: 20 74 68 6f 75 67 68 20 77 72 69 74 65 73 20 74   though writes t
0ef0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
0f00: 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73  * journal occurs
0f10: 20 77 69 74 68 20 6a 75 73 74 20 50 41 47 45 52   with just PAGER
0f20: 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66 74 65  _RESERVED.  Afte
0f30: 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  r an sqlite3Page
0f40: 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f  rRollback().** o
0f50: 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  r sqlite3PagerCo
0f60: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20  mmitPhaseTwo(), 
0f70: 74 68 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f  the state can go
0f80: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
0f90: 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20  HARED,.** or it 
0fa0: 63 61 6e 20 73 74 61 79 20 61 74 20 50 41 47 45  can stay at PAGE
0fb0: 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66 20 77  R_EXCLUSIVE if w
0fc0: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
0fd0: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
0fe0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
0ff0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1000: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1010: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1020: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1030: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1040: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
1050: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
1060: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
1070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1080: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
1090: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10a0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
10b0: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
10c0: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41        5../*.** A
10d0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
10e0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
10f0: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
1100: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
1110: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
1120: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
1130: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
1140: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
1150: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1160: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
1170: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
1180: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
1190: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
11a0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
11b0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
11c0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
11d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
11e0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
11f0: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
1200: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
1210: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
1220: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
1230: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
1240: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
1250: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
1260: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
1270: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
1280: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
1290: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
12a0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
12b0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
12c0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
12d0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
12e0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
12f0: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
1300: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
1310: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
1320: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
1330: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
1340: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
1350: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
1360: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
1370: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
1380: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
1390: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
13a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
13b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
13c0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
13d0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
13e0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
13f0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
1400: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
1410: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
1420: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
1430: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
1440: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
1450: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
1460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1470: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
1480: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
1490: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
14a0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
14b0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
14c0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14d0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
14e0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
14f0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1500: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1510: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1520: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
1530: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1540: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
1550: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1560: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
1570: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1580: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
1590: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
15a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15b0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
15c0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
15d0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
15e0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
15f0: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
1600: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
1610: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
1620: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
1630: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1640: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
1650: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
1660: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1670: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
16a0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
16b0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
16c0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
16d0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
16e0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
16f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
1700: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
1710: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
1720: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
1730: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1750: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
1760: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
1770: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1790: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
17a0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
17b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ournal */.};../*
17c0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
17d0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
17e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
17f0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1800: 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a  .**.** errCode.*
1810: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72  *.**   Pager.err
1820: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
1830: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
1840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
1850: 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49   or.**   or SQLI
1860: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
1870: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
1880: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
1890: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
18a0: 2a 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75  **   and is retu
18b0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
18c0: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
18d0: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
18e0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49  .  The.**   SQLI
18f0: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
1900: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
1910: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
1920: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
1930: 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20  l the.**   next 
1940: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
1950: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
1960: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
1970: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20  che. Also,.**   
1980: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
1990: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
19a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19b0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
19c0: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20  erLookup().**   
19d0: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
19e0: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
19f0: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  cessfully..**.**
1a00: 20 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62   dbSizeValid, db
1a10: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1a20: 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a  , dbFileSize.**.
1a30: 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68  **   Managing th
1a40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1a50: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
1a60: 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ages is a little
1a70: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a   complicated..**
1a80: 20 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20     The variable 
1a90: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e  Pager.dbSize con
1aa0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1ab0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1ac0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
1ad0: 20 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79   image currently
1ae0: 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68   contains. As th
1af0: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1b00: 20 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b   grows or shrink
1b10: 73 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69  s this.**   vari
1b20: 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e  able is updated.
1b30: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
1b40: 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63  ger.dbFileSize c
1b50: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
1b60: 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73  er.**   of pages
1b70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b80: 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20   file. This may 
1b90: 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
1ba0: 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a  m Pager.dbSize.*
1bb0: 2a 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65  *   if some page
1bc0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65  s have been appe
1bd0: 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1be0: 62 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e  base image but n
1bf0: 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a  ot yet written.*
1c00: 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65  *   out from the
1c10: 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63   cache to the ac
1c20: 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  tual file on dis
1c30: 6b 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61  k. Or if the ima
1c40: 67 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20  ge has been.**  
1c50: 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e   truncated by an
1c60: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1c70: 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  uum operation. T
1c80: 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53  he Pager.dbOrigS
1c90: 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
1ca0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e    contains the n
1cb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1cc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1cd0: 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75  mage when the cu
1ce0: 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73  rrent.**   trans
1cf0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
1d00: 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  d. The contents 
1d10: 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20  of all three of 
1d20: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
1d30: 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61  is.**   only gua
1d40: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f  ranteed to be co
1d50: 72 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f  rrect if the boo
1d60: 6c 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  lean Pager.dbSiz
1d70: 65 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a  eValid is true..
1d80: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e  **.**   TODO: Un
1d90: 64 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69  der what conditi
1da0: 6f 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c  ons is dbSizeVal
1db0: 69 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f  id set? Cleared?
1dc0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
1dd0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
1de0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
1df0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1e00: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1e10: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1e20: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
1e30: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
1e40: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
1e50: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
1e60: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
1e70: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
1e80: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
1e90: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
1ea0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
1eb0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
1ec0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
1ed0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
1ee0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
1ef0: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
1f00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1f10: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1f30: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
1f40: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
1f50: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
1f60: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
1f70: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
1f80: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f90: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
1fa0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1fb0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
1fc0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
1fd0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
1fe0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
1ff0: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
2000: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
2010: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2020: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
2030: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
2040: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
2050: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
2060: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
2070: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
2080: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
2090: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
20a0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
20b0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
20c0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
20d0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
20e0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
20f0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64  ted..**.** dbMod
2100: 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  ified.**.**   Th
2110: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2120: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2130: 72 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  r a database pag
2140: 65 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a  e is dirtied..**
2150: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
2160: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2170: 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ach transaction.
2180: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75  .**.**   It is u
2190: 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  sed when committ
21a0: 69 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ing or otherwise
21b0: 20 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61   ending a transa
21c0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74  ction. If.**   t
21d0: 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c  he dbModified fl
21e0: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
21f0: 20 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74   less work has t
2200: 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  o be done..**.**
2210: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a   journalStarted.
2220: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61  **.**   This fla
2230: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2240: 72 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a  r the the main j
2250: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2260: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  . .**.**   The p
2270: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
2280: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
2290: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
22a0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
22b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
22c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22d0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
22e0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
22f0: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
2300: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
2310: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2320: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
2330: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
2340: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2350: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
2360: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
2370: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
2380: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
2390: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
23a0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
23b0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
23c0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
23d0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
23e0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
23f0: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
2400: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
2410: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
2420: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
2430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2440: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
2450: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
2460: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2470: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
2480: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
2490: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
24a0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
24b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
24c0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
24d0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
24e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24f0: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
2500: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
2510: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
2520: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
2530: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
2540: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
2550: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
2560: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
2570: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2580: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
2590: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
25a0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
25b0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
25c0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
25d0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
25e0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
25f0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
2600: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
2610: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
2620: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
2630: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
2640: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
2650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2660: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
2670: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
2680: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
26a0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
26b0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
26c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
26d0: 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a  .** doNotSync.**
26e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
26f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
2700: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
2710: 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a  3PagerWrite()..*
2720: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
2730: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
2740: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
2750: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
2760: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
2770: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
2780: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
2790: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
27a0: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
27b0: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
27c0: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
27d0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27e0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
27f0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
2800: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
2810: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
2820: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
2830: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
2840: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
2850: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2860: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
2870: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
2880: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
2890: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
28a0: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
28b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
28c0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
28d0: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
28e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
28f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
2900: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
2910: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
2920: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
2930: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
2940: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
2950: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
2960: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
2970: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
2980: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
2990: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
29a0: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
29b0: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
29e0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
29f0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
2a00: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
2a10: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2a20: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2a30: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2a40: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2a60: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2a70: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2a80: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
2ab0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2ac0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
2ad0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
2ae0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2af0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
2b00: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
2b10: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
2b20: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2b30: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b40: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2b50: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2b60: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2b70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2b80: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2b90: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
2ba0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2bb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bc0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2bd0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
2be0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bf0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
2c00: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
2c10: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
2c20: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
2c30: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
2c40: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
2c50: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
2c60: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
2c70: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
2c80: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
2c90: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
2ca0: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
2cb0: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
2cc0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
2cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
2ce0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
2cf0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
2d00: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
2d10: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
2d20: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
2d30: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
2d40: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
2d50: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
2d60: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
2d70: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
2d80: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
2d90: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
2da0: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
2db0: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2dc0: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
2dd0: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
2de0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
2df0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
2e00: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
2e10: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
2e20: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
2e40: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2e50: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2e60: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
2e70: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2e80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e90: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2ea0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2eb0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2ec0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ed0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2ee0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2ef0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2f00: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2f10: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2f20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2f30: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2f40: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2f50: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2f60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2f70: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2f80: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f90: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
2fa0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fc0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2fd0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2fe0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2ff0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3010: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3020: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3030: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
3040: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
3050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
3060: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
3070: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
3080: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
3090: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
30a0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
30b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
30c0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30f0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3100: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
3110: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
3120: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
3130: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
3140: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
3150: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
3160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3170: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
3180: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3190: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
31a0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
31b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
31c0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
31d0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
31e0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
31f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
3200: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
3210: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
3220: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
3230: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
3240: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
3250: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
3260: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
3270: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
3280: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
3290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32a0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
32b0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
32c0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
32d0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
32e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
32f0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3310: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
3320: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
3330: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
3340: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
3350: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
3360: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
3370: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
3380: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
3390: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
33a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
33b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
33c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
33d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
33e0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
33f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3400: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
3410: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
3420: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
3430: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
3450: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
3460: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
3470: 61 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53  ader */.  PagerS
3480: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
3490: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
34a0: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
34b0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
34c0: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
34d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34e0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
34f0: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
3500: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
3510: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
3520: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
3530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
3540: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73  anges */.  u32 s
3550: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3560: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3570: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3580: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3590: 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20  ..  u16 nExtra; 
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
35c0: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
35d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
35e0: 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b  .  i16 nReserve;
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3600: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
3610: 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20  ed bytes at end 
3620: 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  of each page */.
3630: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3650: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
3660: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
3670: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
3680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
36a0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
36b0: 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20    Pgno mxPgno;  
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d0: 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
36e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
36f0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
3700: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
3710: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3720: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
3730: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
3740: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
3750: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3760: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3770: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
3780: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
3790: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
37a0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
37b0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
37c0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
37d0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
37e0: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
37f0: 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20  ndler */.#ifdef 
3800: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
3810: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
3820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
3830: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
3840: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
3850: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
3860: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3870: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
3880: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
3890: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
38a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
38b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
38c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
38d0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
38e0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
38f0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
3900: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
3910: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
3920: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
3930: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
3940: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
3950: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
3960: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
3970: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
3980: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
3990: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
39a0: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
39b0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
39c0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
39d0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39f0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
3a00: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
3a10: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
3a20: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
3a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3a40: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
3a50: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
3a60: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69  r tmp use */.  i
3a70: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
3a80: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
3a90: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
3aa0: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
3ab0: 66 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68  files */.  PCach
3ac0: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
3ad0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3ae0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
3af0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
3b00: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
3b10: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
3b20: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
3b30: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
3b40: 63 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  cesses */.};../*
3b50: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
3b60: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
3b70: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
3b80: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
3b90: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
3ba0: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
3bb0: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
3bc0: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
3bd0: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
3be0: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
3bf0: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
3c00: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3c10: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
3c20: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
3c30: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
3c50: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
3c60: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
3c70: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
3c80: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
3c90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3ca0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
3cb0: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
3cc0: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
3cd0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3ce0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
3cf0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
3d00: 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65  rnal */.# define
3d10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
3d20: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
3d30: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
3d40: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a  .#endif..../*.**
3d50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
3d60: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
3d70: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
3d80: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
3d90: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
3da0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
3db0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
3dc0: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
3dd0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
3de0: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
3df0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
3e00: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
3e10: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
3e20: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
3e30: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
3e40: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
3e50: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
3e60: 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65   being.** writte
3e70: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
3e80: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
3e90: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
3ea0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
3eb0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
3ec0: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
3ed0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
3ee0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
3ef0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
3f00: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
3f10: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
3f20: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
3f30: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
3f40: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
3f50: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
3f60: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
3f70: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3f80: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
3f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
3fa0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
3fb0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
3fc0: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
3fd0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
3fe0: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
3ff0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
4000: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
4010: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
4020: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
4030: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
4040: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
4050: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
4060: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
4070: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
4080: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
4090: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
40a0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
40b0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
40c0: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
40d0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
40e0: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
40f0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
4100: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
4110: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
4120: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
4130: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
4140: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
4150: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
4160: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
4170: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
4180: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
4190: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
41a0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
41b0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
41c0: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
41d0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
41e0: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
41f0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
4200: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
4210: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
4220: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
4230: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
4240: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
4250: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
4260: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
4270: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
4280: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
4290: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
42a0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
42b0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
42c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
42d0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61  ize of the of ea
42e0: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  ch page record i
42f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4300: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65   given by.** the
4310: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
4320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
4330: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4340: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
4350: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
4360: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
4370: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
4380: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73  this pager. This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20   is usually the 
43a0: 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73  same .** size as
43b0: 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
43c0: 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20  ector. See also 
43d0: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e  setSectorSize().
43e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
43f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4400: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4410: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4420: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
4430: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
4440: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
4450: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
4460: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
4470: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
4480: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
4490: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
44a0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
44b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
44c0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
44d0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
44e0: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
44f0: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4500: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4510: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
4530: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
4540: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
4550: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
4560: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
4570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
4580: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
4590: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
45a0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
45b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
45c0: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
45d0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
45e0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
45f0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
4600: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
4610: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a  e(pPager) );.*/.
4620: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
4630: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
4640: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
4650: 20 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20   /* A temp-file 
4660: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47  is always in PAG
4670: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20  ER_EXCLUSIVE or 
4680: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
4690: 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
46a0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
46b0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
46c0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
46d0: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
46e0: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
46f0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
4700: 79 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d  ys set for temp-
4710: 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
4720: 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
4730: 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ile==0 || pPager
4740: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
4750: 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31  e );..  return 1
4760: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4770: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4780: 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
4790: 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a   to write page *
47a0: 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62  pPg into the sub
47b0: 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70  -journal..** A p
47c0: 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
47d0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
47e0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
47f0: 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
4800: 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e  .** or more open
4810: 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20   savepoints for 
4820: 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  which:.**.**   *
4830: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
4840: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
4850: 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53   equal to PagerS
4860: 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20  avepoint.nOrig, 
4870: 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62  and.**   * The b
4880: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
4890: 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d   to the page-num
48a0: 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69  ber is not set i
48b0: 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61  n.**     PagerSa
48c0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
48d0: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
48e0: 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73  int subjRequires
48f0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
4900: 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  {.  Pgno pgno = 
4910: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  pPg->pgno;.  Pag
4920: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4930: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
4940: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4950: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
4960: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61  nt; i++){.    Pa
4970: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
4980: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
4990: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
49a0: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
49b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
49c0: 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53  tvecTest(p->pInS
49d0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
49e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
49f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
4a00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4a10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4a20: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
4a30: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
4a40: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nal file..*/.sta
4a50: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f  tic int pageInJo
4a60: 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67  urnal(PgHdr *pPg
4a70: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
4a80: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
4a90: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  g->pPager->pInJo
4aa0: 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
4ab0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
4ac0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4ad0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
4ae0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4af0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
4b00: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4b10: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
4b20: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4b30: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
4b40: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
4b50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4b60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4b80: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4b90: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4ba0: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
4bb0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
4bc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
4bd0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
4be0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
4bf0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
4c00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
4c10: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
4c20: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
4c30: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
4c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4c50: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
4c60: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
4c70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
4c90: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4ca0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
4cb0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
4cc0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
4cd0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
4ce0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
4cf0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
4d00: 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ,B)../*.** Write
4d10: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4d20: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
4d30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4d40: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4d50: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
4d60: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
4d70: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
4d80: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
4d90: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
4da0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
4db0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
4dc0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
4dd0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
4de0: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
4df0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4e00: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
4e10: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
4e20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
4e30: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
4e40: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
4e50: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
4e60: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
4e70: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
4e80: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
4e90: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
4ea0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
4eb0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
4ec0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
4ed0: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
4ee0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
4ef0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
4f00: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
4f10: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
4f20: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
4f30: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
4f40: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
4f50: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
4f60: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
4f70: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
4f80: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
4f90: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
4fa0: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
4fb0: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
4fc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
4fd0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
4fe0: 66 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20  f( !isOpen(pFd) 
4ff0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5000: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
5010: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
5020: 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b  nlock(pFd, eLock
5030: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
5040: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
5050: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
5060: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
5070: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
5080: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
5090: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
50a0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
50b0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
50c0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
50d0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
50e0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
50f0: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
5100: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
5110: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
5120: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
5130: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
5140: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
5150: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
5160: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
5170: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
5180: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
5190: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
51a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
51b0: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
51c0: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
51d0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
51e0: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
51f0: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
5200: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
5210: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
5220: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
5230: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
5240: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
5250: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
5260: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
5270: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
5280: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
5290: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
52a0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
52b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
52c0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
52d0: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
52e0: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
52f0: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
5300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5310: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
5320: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
5330: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
5340: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
5350: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
5360: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
5370: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
5380: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
53b0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
53c0: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
53f0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
5400: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
5410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
5420: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
5430: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
5440: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
5450: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
5460: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
5470: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
5480: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
5490: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
54a0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
54b0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
54c0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
54d0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
54e0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
54f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
5500: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5510: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
5520: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
5530: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
5540: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
5550: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
5560: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
5570: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
5580: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
5590: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
55a0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
55b0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
55c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
55d0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
55e0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
55f0: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
5600: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
5610: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
5620: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
5630: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
5640: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
5650: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
5660: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
5670: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
5680: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
5690: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
56a0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
56b0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
56c0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
56d0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
56e0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
56f0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
5700: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
5710: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5720: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
5730: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
5740: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
5750: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
5760: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
5770: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
5780: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5790: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
57a0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
57b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
57c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
57d0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
57e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
57f0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
5800: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
5810: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
5820: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
5830: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
5840: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
5850: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
5860: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
5870: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
5880: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
5890: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
58a0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
58b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
58c0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
58d0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
58e0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
58f0: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
5900: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
5910: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
5920: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
5930: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
5940: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
5950: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
5960: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
5970: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5980: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
5990: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
59a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
59b0: 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  ode.      || (pP
59c0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
59d0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
59e0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
59f0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
5a00: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
5a10: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
5a20: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
5a30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
5a40: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43    0.#define CHEC
5a50: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
5a60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
5a70: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
5a80: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
5a90: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
5aa0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
5ab0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
5ac0: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
5ad0: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
5ae0: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
5af0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5b00: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
5b10: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
5b20: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
5b30: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
5b40: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
5b50: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
5b60: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
5b70: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
5b80: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
5b90: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
5ba0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
5bb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5bc0: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
5bd0: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5be0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
5bf0: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
5c00: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
5c10: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
5c20: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
5c30: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
5c40: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
5c50: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
5c60: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
5c70: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
5c80: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
5c90: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
5ca0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
5cb0: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
5cc0: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
5cd0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
5ce0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
5cf0: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
5d00: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
5d10: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
5d20: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
5d30: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
5d40: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
5d50: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
5d60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
5d70: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
5d80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5d90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
5da0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
5db0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
5dc0: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
5dd0: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
5de0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
5df0: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
5e00: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
5e10: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
5e20: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
5e30: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
5e40: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5e50: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
5e60: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
5e70: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
5e80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5e90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
5ea0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
5eb0: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
5ec0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
5ed0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
5ee0: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
5ef0: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
5f00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
5f10: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
5f20: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
5f30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5f40: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5f50: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
5f60: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
5f70: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
5f80: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
5fb0: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
5fe0: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
5ff0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
6000: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
6010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
6020: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
6030: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
6040: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
6050: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
6070: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
6080: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
6090: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60b0: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
60c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
60d0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
60e0: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
60f0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6100: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6110: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
6120: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
6130: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6140: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6150: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
6160: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
6170: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6180: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
6190: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
61a0: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
61b0: 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49  ster .   || SQLI
61c0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
61d0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
61e0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
61f0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
6200: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
6210: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
6220: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
6230: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
6240: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
6250: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
6260: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6270: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
6280: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
6290: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
62a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
62b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
62c0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
62d0: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
62e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
62f0: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
6300: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
6310: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
6320: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
6330: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
6340: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
6350: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
6360: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
6370: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
6380: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
6390: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
63a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
63b0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
63c0: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
63d0: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
63e0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
63f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
6400: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
6410: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
6420: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
6430: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
6440: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
6450: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
6460: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
6470: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6480: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
6490: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
64a0: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
64b0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
64c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
64d0: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
64e0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
64f0: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
6500: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
6510: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
6520: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
6530: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
6540: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
6550: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
6560: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
6570: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
6610: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
6620: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
6630: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
6640: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
6650: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
6660: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
6670: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
6680: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6690: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
66a0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
66b0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
66c0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
66d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
66e0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
66f0: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
6700: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6710: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
6720: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
6730: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
6740: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
6750: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
6760: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
6770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
6780: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
6790: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
67a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
67b0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
67c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
67d0: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
67e0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
67f0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
6800: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
6810: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
6820: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
6830: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
6840: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
6850: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
6860: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
6870: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
6880: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
6890: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
68a0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
68b0: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
68c0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
68d0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
68e0: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
68f0: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
6900: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
6910: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
6920: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
6930: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
6940: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
6950: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
6960: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
6970: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
6980: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
6990: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
69a0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
69b0: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
69c0: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
69d0: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
69e0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
69f0: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
6a00: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
6a10: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
6a20: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
6a30: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
6a40: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6a50: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
6a60: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
6a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
6a80: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
6a90: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
6aa0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
6ab0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
6ac0: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
6ad0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6ae0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
6af0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
6b00: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
6b10: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
6b20: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
6b30: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
6b40: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
6b50: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
6b60: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
6b70: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
6b80: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
6b90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
6ba0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
6bd0: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
6be0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
6bf0: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
6c00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6c10: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
6c20: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
6c30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
6c40: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
6c50: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
6c60: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
6c70: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
6c80: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
6c90: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
6ca0: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6cc0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
6cd0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
6ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
6cf0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
6d00: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
6d10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6d20: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
6d30: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
6d40: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
6d50: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
6d60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6d70: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
6d80: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
6d90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
6da0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
6db0: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
6dc0: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  LY|pPager->sync_
6dd0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  flags);.    }.. 
6de0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
6df0: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
6e00: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6e10: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
6e20: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
6e30: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
6e40: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
6e50: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
6e60: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
6e70: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
6e80: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
6e90: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
6ea0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
6eb0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
6ec0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
6ed0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
6ee0: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
6ef0: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
6f00: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
6f10: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
6f20: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
6f30: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
6f40: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6f50: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
6f60: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
6f70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6f80: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6f90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
6fa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
6fb0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
6fc0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
6fd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6fe0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6ff0: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
7000: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7010: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7020: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
7030: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
7040: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
7050: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7060: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
7070: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
7080: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
7090: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
70a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
70b0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
70c0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
70d0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
70e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
70f0: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
7100: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
7110: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
7120: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
7130: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
7140: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
7150: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
7160: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
7170: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
7180: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
7190: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
71a0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
71b0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
71c0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
71d0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
71e0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
71f0: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
7200: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
7210: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
7220: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
7230: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
7240: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
7250: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
7260: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
7270: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
7280: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
7290: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
72a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
72b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
72e0: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
72f0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
7300: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
7310: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
7320: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
7330: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
7340: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
7350: 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ze;     /* Size 
7360: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
7370: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
7380: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
73b0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
73c0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
73d0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7400: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
7410: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
7420: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
7430: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
7440: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
7450: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
7460: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7470: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
7480: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
7490: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
74a0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
74b0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
74c0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
74d0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
74e0: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
74f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
7500: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
7510: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
7520: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
7530: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
7540: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
7550: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
7560: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
7570: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
7580: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
7590: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
75a0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
75b0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
75c0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
75d0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
75e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
75f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
7600: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
7610: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
7620: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
7630: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
7640: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
7650: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
7660: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
7670: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
7680: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
7690: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
76a0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
76b0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
76c0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
76d0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
76e0: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
76f0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
7700: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
7710: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
7720: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
7730: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
7740: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
7750: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
7760: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
7770: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
7780: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
7790: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
77a0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
77b0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
77c0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
77d0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
77e0: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
77f0: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
7800: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
7810: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
7820: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
7830: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7840: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
7850: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
7860: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
7870: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
7880: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
7890: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
78a0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
78b0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
78c0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
78d0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
78e0: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
78f0: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
7900: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
7910: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
7920: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
7930: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
7940: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
7950: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
7960: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
7970: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
7980: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
7990: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
79a0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
79b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
79c0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
79d0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
79e0: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
79f0: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
7a00: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
7a10: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7a20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
7a30: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
7a40: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
7a50: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
7a60: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
7a70: 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d  ync) || (pPager-
7a80: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7a90: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7aa0: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
7ab0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7ac0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
7ad0: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
7ae0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
7af0: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65  ND) .  ){.    me
7b00: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
7b10: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
7b20: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7b30: 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69  c));.    put32bi
7b40: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7b50: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b60: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
7b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
7b80: 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c  mset(zHeader, 0,
7b90: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7ba0: 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a  Magic)+4);.  }..
7bb0: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
7bc0: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
7bd0: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
7be0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
7bf0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
7c00: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
7c10: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7c20: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7c30: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7c40: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
7c70: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
7c80: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7c90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7ca0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7cb0: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
7cc0: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
7cd0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7ce0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
7cf0: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
7d00: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7d10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d20: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
7d30: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
7d40: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
7d50: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7d60: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7d70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7d80: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
7d90: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
7da0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
7db0: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
7dc0: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
7dd0: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
7de0: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
7df0: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
7e00: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
7e10: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
7e20: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
7e30: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
7e40: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
7e50: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
7e60: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
7e70: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
7e80: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7e90: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
7ea0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7eb0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ec0: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
7ed0: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
7ee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ef0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
7f00: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
7f10: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
7f20: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
7f30: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
7f40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
7f50: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
7f60: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
7f70: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
7f80: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
7f90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
7fa0: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
7fb0: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
7fc0: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
7fd0: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
7fe0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
7ff0: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
8000: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
8010: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
8020: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
8030: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
8040: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
8050: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
8060: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
8070: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
8080: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
8090: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
80a0: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
80b0: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
80c0: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
80d0: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
80e0: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
80f0: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
8100: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
8110: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
8120: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
8130: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
8140: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
8150: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
8160: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
8170: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
8180: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
8190: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
81a0: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
81b0: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
81c0: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
81d0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
81e0: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
81f0: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
8200: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
8210: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
8220: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
8230: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8240: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
8250: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
8260: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
8270: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
8280: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
8290: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
82a0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
82b0: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
82c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
82d0: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
82e0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
82f0: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
8300: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
8310: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
8320: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
8330: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
8340: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8350: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
8360: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
8370: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
8380: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
8390: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
83a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
83b0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
83c0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
83d0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
83e0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
83f0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
8400: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8410: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
8420: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8430: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
8440: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8450: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
8460: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
8470: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
8480: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
8490: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
84a0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
84b0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
84c0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
84d0: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
84e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
84f0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
8500: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
8510: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
8520: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
8530: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
8540: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
8550: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
8560: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
8570: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
8580: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
8590: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
85a0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
85b0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
85c0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
85d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
85e0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
85f0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
8600: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
8610: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
8620: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
8630: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
8640: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
8650: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
8660: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
8670: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
8680: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
8690: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
86a0: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
86b0: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
86c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
86d0: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
86e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
86f0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
8700: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
8710: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8720: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
8730: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
8740: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
8750: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
8760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
8770: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
8780: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8790: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
87a0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
87b0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
87c0: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87e0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
87f0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8800: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8810: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8820: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8830: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
8840: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
8850: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8860: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8870: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8880: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8890: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
88a0: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
88b0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
88c0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
88d0: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8900: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8910: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8920: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8930: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
8940: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
8950: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8960: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8970: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8980: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8990: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
89a0: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
89b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
89c0: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
89d0: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
89e0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
89f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8a00: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8a10: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8a20: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8a30: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8a40: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8a50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8a60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8a70: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8a80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8a90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8aa0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8ab0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8ac0: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8ad0: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8ae0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8af0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8b00: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8b10: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8b20: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8b30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8b40: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8b50: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8b60: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8b70: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8b80: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8b90: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8ba0: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8bb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
8bc0: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
8bd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
8be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8bf0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8c00: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8c10: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8c20: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
8c30: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8c40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8c50: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
8c60: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8c70: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8c80: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
8c90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8ca0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8cb0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8cc0: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8cd0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8ce0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8cf0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8d00: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8d10: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8d30: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8d40: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8d50: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8d60: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8d70: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8d80: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8d90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8da0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8db0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8dc0: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8dd0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8de0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8df0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e00: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8e10: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8e20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e30: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e40: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e50: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8e60: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8e70: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8e80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8e90: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8ea0: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8ec0: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8ed0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8ee0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8ef0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8f00: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8f10: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8f20: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8f30: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8f40: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8f50: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8f60: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8f70: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8f80: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8f90: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8fa0: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8fb0: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8fc0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8fd0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8fe0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8ff0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
9000: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
9010: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9020: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9030: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9040: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
9050: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
9060: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9070: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
9080: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
9090: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
90a0: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
90b0: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
90c0: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
90d0: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
90e0: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
90f0: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
9100: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
9110: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
9120: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9130: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
9140: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
9150: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
9160: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
9170: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
9180: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
9190: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
91a0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
91b0: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
91c0: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
91d0: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
91e0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
91f0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
9200: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
9210: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
9220: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
9230: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
9240: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
9250: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
9260: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9270: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
9280: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
9290: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
92a0: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
92b0: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
92c0: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
92d0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
92e0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
92f0: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
9300: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
9310: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
9320: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
9330: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
9340: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
9350: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
9360: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
9370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9380: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
9390: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
93a0: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
93b0: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
93c0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
93d0: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
93e0: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
93f0: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
9400: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
9410: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
9420: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
9430: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
9440: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
9450: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
9460: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
9470: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
9480: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
9490: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
94a0: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
94b0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
94c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
94d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
94e0: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
94f0: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
9500: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
9510: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
9520: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
9530: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
9540: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
9550: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
9560: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
9570: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
9580: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
9590: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
95a0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
95b0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
95c0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
95d0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
95e0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
95f0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
9600: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
9610: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
9620: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
9630: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
9640: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
9650: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
9660: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
9670: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
9680: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
9690: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
96a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
96b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
96c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
96d0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
96e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
96f0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
9700: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
9710: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
9720: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
9730: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
9740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
9750: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
9760: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
9770: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9780: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9790: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
97a0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
97b0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
97c0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
97d0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
97e0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
97f0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
9800: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
9810: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
9820: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
9830: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
9840: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
9850: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
9860: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
9870: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
9880: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
9890: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
98a0: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
98b0: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
98c0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
98d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
98e0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
98f0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
9900: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
9910: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
9920: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
9930: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
9940: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
9950: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
9960: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
9970: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
9980: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
9990: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
99a0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
99b0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
99c0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
99d0: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
99e0: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
99f0: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
9a00: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
9a10: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
9a20: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
9a30: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
9a40: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
9a50: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9a80: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
9a90: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
9aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
9ab0: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
9ac0: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
9ad0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9af0: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
9b00: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
9b10: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
9b20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9b30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
9b50: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
9b60: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9b80: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
9b90: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
9ba0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
9bb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
9bc0: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
9bd0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9be0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9bf0: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
9c00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
9c10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9c20: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
9c30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c40: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
9c50: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
9c60: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
9c70: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
9c80: 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
9c90: 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
9ca0: 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
9cb0: 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
9cc0: 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
9cd0: 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
9ce0: 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
9cf0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
9d00: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
9d10: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
9d20: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
9d30: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
9d40: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
9d50: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
9d60: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
9d70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
9d80: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
9d90: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
9da0: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
9db0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
9dc0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
9dd0: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
9de0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
9df0: 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
9e00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
9e10: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
9e20: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
9e30: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
9e40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
9e50: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
9e60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
9e70: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
9e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
9e90: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
9ea0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
9eb0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9ec0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
9ed0: 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
9ee0: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
9ef0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9f00: 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
9f10: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
9f20: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9f30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9f40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
9f50: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
9f60: 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
9f70: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9f80: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9f90: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9fa0: 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
9fb0: 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
9fc0: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9fd0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9fe0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9ff0: 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
a000: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
a010: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
a020: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
a030: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20  ournalMagic, 8, 
a040: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
a050: 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  r+8))).  ){.    
a060: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a070: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a080: 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b  Off += (nMaster+
a090: 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  20);.  pPager->n
a0a0: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
a0b0: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a  r->noSync;..  /*
a0c0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a0d0: 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
a0e0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
a0f0: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
a100: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
a110: 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
a120: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a130: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
a140: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
a150: 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
a160: 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
a170: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
a180: 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
a190: 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
a1a0: 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
a1b0: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
a1c0: 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
a1d0: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
a1e0: 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
a1f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
a200: 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
a210: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
a220: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
a230: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
a240: 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
a250: 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
a260: 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
a280: 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
a290: 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
a2a0: 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
a2b0: 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
a2c0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
a2d0: 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
a2e0: 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
a2f0: 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
a300: 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
a310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
a320: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
a330: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
a340: 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
a350: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a360: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
a370: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
a380: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
a390: 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a  number. Return.*
a3a0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
a3b0: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
a3c0: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
a3d0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a   page is not .**
a3e0: 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f   already in memo
a3f0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  ry..*/.static Pg
a400: 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
a410: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
a420: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
a430: 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
a460: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
a470: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
a480: 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68   a call to Pcach
a490: 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72  eFetch() with cr
a4a0: 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20  eateFlag==0 to. 
a4b0: 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20   ** fail, since 
a4c0: 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  no attempt to al
a4d0: 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d  locate dynamic m
a4e0: 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61  emory will be ma
a4f0: 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64  de..  */.  (void
a500: 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65  )sqlite3PcacheFe
a510: 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
a520: 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
a530: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
a540: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74  ../*.** Unless t
a550: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a560: 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73 63  rror-state, disc
a570: 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
a580: 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74  y pages. If.** t
a590: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a5a0: 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65 6e  rror-state, then
a5b0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
a5c0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  no-op..**.** TOD
a5d0: 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e 6f  O: Why can we no
a5e0: 74 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  t reset the page
a5f0: 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f 72  r while in error
a600: 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74 69   state?.*/.stati
a610: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
a620: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
a630: 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ){.  if( SQLITE_
a640: 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72 43  OK==pPager->errC
a650: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
a660: 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
a670: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
a680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
a690: 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
a6a0: 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 70  >pPCache);.    p
a6b0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
a6c0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  id = 0;.  }.}../
a6d0: 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
a6e0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
a6f0: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
a700: 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
a710: 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
a720: 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
a730: 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
a740: 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
a750: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
a760: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
a770: 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
a780: 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
a790: 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
a7a0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
a7b0: 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
a7c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
a7d0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
a7e0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
a7f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
a800: 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
a810: 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
a820: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
a830: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
a840: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
a850: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
a860: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
a870: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
a880: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
a890: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
a8a0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
a8b0: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
a8c0: 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
a8d0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
a8e0: 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
a8f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
a900: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a910: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
a920: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
a930: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a940: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
a950: 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
a960: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
a970: 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
a980: 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
a990: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
a9a0: 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
a9b0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
a9c0: 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
a9d0: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
a9e0: 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
a9f0: 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
aa00: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
aa10: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
aa20: 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
aa30: 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
aa40: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
aa50: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
aa80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
aa90: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
aaa0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
aab0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
aac0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
aad0: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
aae0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
aaf0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
ab00: 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
ab10: 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
ab20: 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
ab30: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
ab40: 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
ab50: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
ab60: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
ab70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
ab80: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
ab90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
aba0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
abc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
abd0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
abe0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
abf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
ac00: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
ac10: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
ac20: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
ac30: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
ac40: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
ac50: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
ac60: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
ac70: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
ac80: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
ac90: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
aca0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
acb0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
acc0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
acd0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
ace0: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
acf0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
ad00: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
ad10: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
ad20: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ad30: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
ad40: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
ad50: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
ad60: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
ad70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
ad80: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
ad90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
ada0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
adb0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
adc0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
add0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ade0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
adf0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73    /* Always clos
ae00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
ae10: 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
ae20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
ae30: 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  ck..    ** Other
ae40: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
ae50: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
ae60: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
ae70: 65 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64  e might.    ** d
ae80: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f  elete the file o
ae90: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
aea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
aeb0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
aec0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71  er->jfd);.    sq
aed0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
aee0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
aef0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
af00: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
af10: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41   0;.    releaseA
af20: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
af30: 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
af40: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
af50: 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20  ocked, somebody 
af60: 65 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67  else might chang
af70: 65 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a  e it. The.    **
af80: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
af90: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65  n Pager.dbSize e
afa0: 74 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  tc. might become
afb0: 20 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20   invalid if.    
afc0: 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  ** this happens.
afd0: 20 20 4f 6e 65 20 63 61 6e 20 61 72 67 75 65 20    One can argue 
afe0: 74 68 61 74 20 74 68 69 73 20 64 6f 65 73 6e 27  that this doesn'
aff0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
b000: 61 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69  ared.    ** unti
b010: 6c 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  l the change-cou
b020: 6e 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73  nter check fails
b030: 20 69 6e 20 50 61 67 65 72 53 68 61 72 65 64 4c   in PagerSharedL
b040: 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2a 20 43 6c  ock()..    ** Cl
b050: 65 61 72 69 6e 67 20 74 68 65 20 70 61 67 65 20  earing the page 
b060: 73 69 7a 65 20 63 61 63 68 65 20 68 65 72 65 20  size cache here 
b070: 69 73 20 62 65 69 6e 67 20 63 6f 6e 73 65 72 76  is being conserv
b080: 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
b090: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
b0a0: 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20  Valid = 0;..    
b0b0: 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  rc = osUnlock(pP
b0c0: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
b0d0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  K);.    if( rc )
b0e0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
b0f0: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
b100: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b110: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
b120: 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a  pPager))..    /*
b130: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
b140: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
b150: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
b160: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
b170: 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74   be.    ** trust
b180: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
b190: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
b1a0: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
b1b0: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
b1c0: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
b1d0: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
b1e0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
b1f0: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
b200: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
b210: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
b220: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b230: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b240: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
b250: 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
b260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
b270: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
b280: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
b290: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
b2a0: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  tDone = 0;.    p
b2b0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
b2c0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
b2d0: 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
b2e0: 69 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ied = 0;.  }.}..
b2f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b300: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ion should be ca
b310: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45  lled when an IOE
b320: 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46  RR, CORRUPT or F
b330: 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79  ULL error.** may
b340: 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20   have occurred. 
b350: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
b360: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
b370: 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a  to the pager .**
b380: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
b390: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
b3a0: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
b3b0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
b3c0: 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75  pager .** API fu
b3d0: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75  nction. The valu
b3e0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
b3f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
b400: 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  nd argument .** 
b410: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
b420: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
b430: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
b440: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
b450: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
b460: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
b470: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
b480: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
b490: 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69   Until the persi
b4a0: 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c  sten error is cl
b4b0: 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71  eared,.** subseq
b4c0: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
b4d0: 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c  n this Pager wil
b4e0: 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
b4f0: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a  turn the same .*
b500: 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  * error code..**
b510: 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74  .** A persistent
b520: 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73   error indicates
b530: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
b540: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
b550: 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
b560: 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
b570: 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
b580: 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
b590: 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
b5a0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
b5b0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
b5c0: 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
b5d0: 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
b5e0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
b5f0: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
b600: 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
b610: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
b620: 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
b630: 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
b640: 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
b650: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
b660: 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
b670: 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
b680: 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
b690: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
b6a0: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
b6b0: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
b6c0: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
b6d0: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
b6e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b6f0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
b700: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
b710: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
b720: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
b730: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b740: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
b750: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
b760: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
b770: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
b780: 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
b790: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
b7a0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
b7b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
b7c0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
b7d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b7e0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
b7f0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
b800: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
b810: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
b820: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
b830: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
b840: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
b850: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
b860: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
b870: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
b880: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
b890: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
b8a0: 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
b8b0: 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
b8c0: 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
b8d0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
b8e0: 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
b8f0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
b900: 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
b910: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
b920: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
b930: 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d  state. If this m
b940: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
b950: 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
b960: 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
b970: 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
b980: 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   next connection
b990: 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
b9a0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
b9b0: 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
b9c0: 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
b9d0: 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74   will.** roll it
b9e0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
b9f0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
ba00: 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
ba10: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
ba20: 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
ba30: 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
ba40: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
ba50: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
ba60: 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
ba70: 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
ba80: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
ba90: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68   error state. Wh
baa0: 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
bab0: 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
bac0: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
bad0: 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
bae0: 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
baf0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
bb00: 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
bb10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bb20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
bb30: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
bb40: 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
bb50: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
bb60: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
bb70: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
bb80: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
bb90: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
bba0: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
bbb0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
bbc0: 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  c();.  }.  pager
bbd0: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
bbe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
bbf0: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
bc00: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
bc10: 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
bc20: 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
bc30: 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
bc40: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
bc50: 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
bc60: 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
bc70: 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
bc80: 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
bc90: 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
bca0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
bcb0: 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
bcc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bcd0: 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
bce0: 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
bcf0: 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
bd00: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
bd10: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
bd20: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
bd30: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
bd40: 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  or PAGER_UNLOCK 
bd50: 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
bd60: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
bd70: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
bd80: 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c  -op (returns SQL
bd90: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f  ITE_OK)..**.** O
bda0: 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
bdb0: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
bdc0: 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
bdd0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
bde0: 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
bdf0: 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
be00: 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
be10: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
be20: 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
be30: 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
be40: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
be50: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
be60: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
be70: 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
be80: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
be90: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
bea0: 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
beb0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
bec0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
bed0: 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
bee0: 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
bef0: 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
bf00: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bf10: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
bf20: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
bf30: 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
bf40: 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
bf50: 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
bf60: 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
bf70: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
bf80: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
bf90: 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
bfa0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
bfb0: 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
bfc0: 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
bfd0: 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
bfe0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
bff0: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
c000: 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
c010: 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
c020: 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
c030: 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
c040: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
c050: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
c060: 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
c070: 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
c080: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
c090: 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
c0a0: 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
c0b0: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
c0c0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c0d0: 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
c0e0: 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
c0f0: 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
c100: 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
c110: 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
c120: 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
c130: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
c140: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
c150: 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
c160: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
c170: 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
c180: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
c190: 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
c1a0: 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
c1b0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
c1c0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
c1d0: 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
c1e0: 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
c1f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c200: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
c210: 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
c220: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
c230: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
c240: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
c250: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
c260: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
c270: 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
c280: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
c290: 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
c2a0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
c2b0: 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
c2c0: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69   is finalized, i
c2d0: 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
c2e0: 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  -exclusive mode,
c2f0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f   the.** pager mo
c300: 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ves to PAGER_SHA
c310: 52 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64  RED state (and d
c320: 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f  owngrades the lo
c330: 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ck on the.** dat
c340: 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72  abase file accor
c350: 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49  dingly)..**.** I
c360: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
c370: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
c380: 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20  ive mode and is 
c390: 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  in PAGER_SYNCED 
c3a0: 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76  state,.** it mov
c3b0: 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  es to PAGER_EXCL
c3c0: 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20  USIVE. No locks 
c3d0: 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77  are downgraded w
c3e0: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a  hen running in.*
c3f0: 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  * exclusive mode
c400: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
c410: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
c420: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
c430: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
c440: 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
c450: 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
c460: 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
c470: 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
c480: 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
c490: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
c4a0: 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
c4b0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
c4c0: 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
c4d0: 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
c4e0: 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
c4f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c500: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
c510: 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
c520: 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
c530: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c540: 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
c550: 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
c560: 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
c570: 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
c580: 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
c590: 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
c5a0: 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
c5b0: 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
c5c0: 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
c5d0: 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
c5e0: 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
c5f0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
c600: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
c610: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
c620: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
c630: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
c640: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c650: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
c660: 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
c670: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
c680: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
c690: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
c6a0: 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
c6b0: 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
c6c0: 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
c6d0: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  n */..  if( pPag
c6e0: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
c6f0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
c700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c710: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41  ;.  }.  releaseA
c720: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
c730: 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ger);..  assert(
c740: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c750: 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
c760: 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
c770: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
c780: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20  ager->jfd) ){.. 
c790: 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
c7a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c7b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
c7c0: 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
c7d0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
c7e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c7f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
c800: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
c810: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
c820: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
c830: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
c840: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c850: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
c860: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
c870: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
c880: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
c890: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
c8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
c8b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c8d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c8e0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
c8f0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
c900: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
c910: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
c920: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c930: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
c940: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
c950: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
c960: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20  veMode .     || 
c970: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
c980: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
c990: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
c9a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
c9b0: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
c9c0: 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
c9d0: 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
c9e0: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
c9f0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
ca00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
ca10: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
ca20: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
ca30: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ca40: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
ca50: 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
ca60: 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
ca70: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
ca80: 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
ca90: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
caa0: 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
cab0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
cac0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
cad0: 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
cae0: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
caf0: 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
cb00: 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
cb10: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
cb20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
cb30: 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
cb40: 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
cb50: 20 6a 6f 75 72 6e 61 6c 2e 20 20 2a 2f 0a 20 20   journal.  */.  
cb60: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
cb80: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
cb90: 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
cba0: 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
cbb0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
cbc0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
cbd0: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 29 3b  MEMORY .      );
cbe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
cbf0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
cc00: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  d);.      if( !p
cc10: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
cc20: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
cc30: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
cc40: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
cc50: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
cc60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
cc70: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
cc80: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
cc90: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
cca0: 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
ccb0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
ccc0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
ccd0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
cce0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
ccf0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
cd00: 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
cd10: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
cd20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
cd30: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
cd40: 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
cd50: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
cd60: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
cd70: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
cd80: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
cd90: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
cda0: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
cdb0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
cdc0: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
cdd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
cde0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
cdf0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
ce00: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
ce10: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
ce20: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
ce30: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
ce40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
ce50: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
ce60: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
ce70: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
ce80: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
ce90: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74  .  /* TODO: Is t
cea0: 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79  his optimal? Why
ceb0: 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20   is the db size 
cec0: 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65  invalidated here
ced0: 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20   .  ** when the 
cee0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
cef0: 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a   not unlocked? *
cf00: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  /.  pPager->dbOr
cf10: 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  igSize = 0;.  sq
cf20: 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
cf30: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
cf40: 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
cf50: 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ize);.  if( !MEM
cf60: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
cf70: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
cf80: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
cf90: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
cfa0: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
cfb0: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
cfc0: 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
cfd0: 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
cfe0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
cff0: 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
d000: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
d010: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
d020: 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
d030: 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
d040: 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
d050: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
d060: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
d070: 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
d080: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
d090: 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
d0a0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
d0b0: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
d0c0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
d0d0: 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
d0e0: 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
d0f0: 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
d100: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
d110: 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
d120: 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
d130: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
d140: 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
d150: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
d160: 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
d170: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
d180: 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
d190: 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
d1a0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
d1b0: 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
d1c0: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
d1d0: 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
d1e0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
d1f0: 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
d200: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
d210: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
d220: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
d230: 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
d240: 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
d250: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
d260: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
d270: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
d280: 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
d290: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
d2a0: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
d2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
d2c0: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
d2d0: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
d2e0: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
d2f0: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
d300: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
d310: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
d320: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
d330: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
d340: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
d350: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
d360: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
d370: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
d380: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
d390: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
d3a0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
d3b0: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
d3c0: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
d3d0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
d3e0: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
d3f0: 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
d400: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
d410: 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
d420: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
d430: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
d440: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
d450: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
d460: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
d470: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
d480: 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
d490: 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
d4a0: 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
d4b0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
d4c0: 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
d4d0: 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
d4e0: 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
d4f0: 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
d500: 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
d510: 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
d520: 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
d530: 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
d540: 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
d550: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
d560: 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
d570: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
d580: 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61  e isMainJrnl fla
d590: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69  g is true if thi
d5a0: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f  s is the main ro
d5b0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
d5c0: 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  nd.** false for 
d5d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d5e0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e  urnal.  The main
d5f0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d600: 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73  l uses.** checks
d610: 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
d620: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
d630: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
d640: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
d650: 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
d660: 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
d670: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
d680: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
d690: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
d6a0: 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
d6b0: 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
d6c0: 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
d6d0: 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
d6e0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
d6f0: 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
d700: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
d710: 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
d720: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
d730: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
d740: 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
d750: 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
d760: 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
d770: 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
d780: 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
d790: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
d7a0: 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
d7b0: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
d7c0: 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
d7d0: 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
d7e0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
d7f0: 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
d800: 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
d810: 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
d820: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
d830: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
d840: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
d850: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
d860: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
d870: 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
d880: 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
d890: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
d8a0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d8b0: 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
d8c0: 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
d8d0: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
d8e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
d8f0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
d900: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d910: 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
d920: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
d930: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
d940: 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
d950: 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
d960: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
d970: 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
d980: 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
d990: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
d9a0: 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
d9b0: 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
d9c0: 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
d9d0: 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
d9e0: 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
d9f0: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
da00: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
da10: 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
da20: 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
da30: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
da40: 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
da50: 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
da60: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
da70: 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
da80: 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
da90: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
daa0: 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
dab0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
dac0: 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
dad0: 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
dae0: 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
daf0: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
db00: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
db10: 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
db20: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
db30: 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
db40: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
db50: 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
db60: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
db70: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
db80: 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
db90: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
dba0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
dbb0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
dbc0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
dbd0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
dbe0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
dbf0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
dc00: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
dc10: 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
dc20: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
dc30: 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
dc40: 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
dc50: 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
dc60: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
dc70: 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c 20 20   int isUnsync,  
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc90: 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
dca0: 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65 64 20  g from unsynced 
dcb0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
dcc0: 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
dcf0: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
dd00: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
dd10: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
dd20: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
dd30: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dd40: 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
dd50: 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  *pDone          
dd60: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
dd70: 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
dd80: 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
dd90: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
dda0: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddc0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
ddd0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
dde0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
de10: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
de20: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
de30: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de50: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
de60: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
de70: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
de80: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
de90: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
dea0: 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
deb0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
dec0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
ded0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dee0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
def0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
df00: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
df10: 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
df20: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
df30: 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
df40: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
df50: 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
df60: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
df70: 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
df80: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
df90: 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
dfa0: 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
dfb0: 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
dfc0: 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
dfd0: 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
dfe0: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
dff0: 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
e000: 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
e010: 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
e020: 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
e030: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e040: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
e050: 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
e060: 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
e070: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
e080: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
e090: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
e0a0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
e0b0: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
e0c0: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
e0d0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
e0e0: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
e0f0: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
e100: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
e110: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
e120: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
e130: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
e140: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
e150: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
e160: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
e170: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
e180: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e190: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e1a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
e1b0: 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
e1c0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
e1d0: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
e1e0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
e1f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
e200: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
e210: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
e220: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
e230: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
e240: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
e250: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
e260: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
e270: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
e280: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
e290: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
e2a0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
e2b0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
e2c0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
e2d0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
e2e0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
e2f0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
e300: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
e310: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
e320: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
e330: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
e340: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
e350: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
e360: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
e370: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
e380: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
e390: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
e3a0: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
e3b0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
e3c0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
e3d0: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
e3e0: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
e3f0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
e400: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
e410: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e420: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e430: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
e440: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
e450: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
e460: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
e470: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
e480: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
e490: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
e4a0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
e4b0: 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
e4c0: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
e4d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
e4e0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
e4f0: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
e500: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
e510: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
e520: 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  o))!=SQLITE_OK )
e530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e540: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
e550: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
e560: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
e570: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
e580: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
e590: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e5a0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
e5b0: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
e5c0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
e5d0: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
e5e0: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
e5f0: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
e600: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
e610: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
e620: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
e630: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e640: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
e650: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
e660: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
e670: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
e680: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
e690: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
e6a0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
e6b0: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
e6c0: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
e6d0: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
e6e0: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
e6f0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
e700: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
e710: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
e720: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
e730: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
e740: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
e750: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
e760: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
e770: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
e780: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
e790: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
e7a0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
e7b0: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
e7c0: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
e7d0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
e7e0: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
e7f0: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
e800: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
e810: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
e820: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
e830: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
e840: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
e850: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
e860: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
e870: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
e880: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
e890: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
e8a0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
e8b0: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
e8c0: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
e8d0: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
e8e0: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
e8f0: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
e900: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
e910: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
e920: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
e930: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
e940: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
e950: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
e960: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
e970: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
e980: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
e990: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
e9a0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
e9b0: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
e9c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
e9d0: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
e9e0: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
e9f0: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
ea00: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
ea10: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
ea20: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
ea30: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
ea40: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
ea50: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
ea60: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
ea70: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
ea80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
ea90: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
eaa0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
eab0: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
eac0: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
ead0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
eae0: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
eaf0: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
eb00: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
eb10: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
eb20: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
eb30: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
eb40: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
eb50: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
eb60: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
eb70: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
eb80: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
eb90: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
eba0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
ebb0: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
ebc0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
ebd0: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
ebe0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
ebf0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
ec00: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
ec10: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
ec20: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
ec30: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
ec40: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
ec50: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
ec60: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
ec70: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
ec80: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
ec90: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
eca0: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
ecb0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
ecc0: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
ecd0: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
ece0: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
ecf0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ed00: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ed10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
ed20: 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41  | !MEMDB );.  PA
ed30: 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
ed40: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
ed50: 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
ed60: 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
ed70: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
ed80: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
ed90: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
eda0: 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
edc0: 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
edd0: 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
ede0: 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
edf0: 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
ee00: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
ee10: 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30  E).   && (pPg==0
ee20: 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
ee30: 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
ee40: 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65  NC)).   && isOpe
ee50: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
ee60: 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20   && !isUnsync.  
ee70: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
ee80: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
ee90: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
eea0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
eeb0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
eec0: 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  ->fd, (u8*)aData
eed0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
eee0: 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
eef0: 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
ef00: 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
ef10: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
ef20: 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
ef30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
ef40: 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
ef50: 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
ef60: 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
ef70: 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
ef80: 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
ef90: 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
efa0: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
efb0: 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
efc0: 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
efd0: 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
efe0: 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
eff0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
f000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
f010: 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
f020: 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
f030: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
f040: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
f050: 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
f060: 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
f070: 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
f080: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
f090: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
f0a0: 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
f0b0: 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
f0c0: 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
f0d0: 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
f0e0: 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
f0f0: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
f100: 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
f110: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f120: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
f130: 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
f140: 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
f150: 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
f160: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
f170: 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
f180: 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
f190: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
f1a0: 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
f1b0: 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
f1c0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
f1d0: 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
f1e0: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
f1f0: 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
f200: 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
f210: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
f220: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f230: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
f240: 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
f250: 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
f260: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
f270: 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
f280: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
f290: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
f2a0: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
f2b0: 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
f2c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
f2d0: 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
f2e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
f2f0: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
f300: 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
f310: 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
f320: 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
f330: 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
f340: 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
f350: 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
f360: 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
f370: 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
f380: 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
f390: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f3a0: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
f3b0: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20  ;.    if( (rc = 
f3c0: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
f3d0: 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
f3e0: 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c  , &pPg, 1))!=SQL
f3f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f400: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f410: 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
f420: 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
f430: 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
f440: 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
f450: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
f460: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
f470: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
f480: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
f490: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
f4a0: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
f4b0: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
f4c0: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
f4d0: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
f4e0: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
f4f0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
f500: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
f510: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
f520: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
f530: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
f540: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
f550: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
f560: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
f570: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
f580: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
f590: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
f5a0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
f5b0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
f5c0: 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
f5d0: 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
f5e0: 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
f5f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f600: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
f610: 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
f620: 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
f630: 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
f640: 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
f650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f660: 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
f670: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
f680: 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
f690: 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
f6a0: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
f6b0: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
f6c0: 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
f6d0: 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
f6e0: 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
f6f0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
f700: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
f710: 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
f720: 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
f730: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
f740: 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
f750: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
f760: 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
f770: 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
f780: 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  the..      **.  
f790: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
f7a0: 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
f7b0: 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
f7c0: 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
f7d0: 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
f7e0: 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
f7f0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
f800: 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
f810: 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
f820: 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
f830: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
f840: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
f850: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
f860: 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
f870: 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
f880: 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
f890: 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
f8a0: 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
f8b0: 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
f8c0: 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
f8d0: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f8e0: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
f8f0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
f900: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
f910: 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
f920: 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
f930: 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
f940: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
f950: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
f960: 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
f970: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
f980: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
f990: 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
f9a0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
f9b0: 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
f9c0: 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
f9d0: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
f9e0: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
f9f0: 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
fa00: 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
fa10: 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
fa20: 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
fa30: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
fa40: 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
fa50: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
fa60: 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
fa70: 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
fa80: 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
fa90: 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
faa0: 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
fab0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
fac0: 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
fad0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
fae0: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
faf0: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
fb00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
fb10: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
fb20: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
fb30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
fb40: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
fb50: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
fb60: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
fb70: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
fb80: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
fb90: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
fba0: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
fbb0: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
fbc0: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
fbd0: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
fbe0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
fbf0: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
fc00: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
fc10: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
fc20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
fc30: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
fc40: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
fc50: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
fc60: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
fc70: 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
fc80: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
fc90: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
fca0: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
fcb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fcc0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
fcd0: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
fce0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
fcf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
fd00: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
fd10: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
fd20: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
fd30: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
fd40: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
fd50: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
fd60: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
fd70: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
fd80: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
fd90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fda0: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
fdb0: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
fdc0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
fdd0: 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
fde0: 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
fdf0: 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
fe00: 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
fe10: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
fe20: 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
fe30: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
fe40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
fe50: 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
fe60: 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
fe70: 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
fe80: 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
fe90: 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
fea0: 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
feb0: 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
fec0: 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
fed0: 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
fee0: 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
fef0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
ff00: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
ff10: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
ff20: 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
ff30: 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
ff40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
ff50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
ff60: 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
ff70: 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
ff80: 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
ff90: 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
ffa0: 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
ffb0: 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
ffc0: 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
ffd0: 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
ffe0: 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
fff0: 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
10000 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
10010 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
10020 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
10030 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
10040 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
10050 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
10060 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10070 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10080 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
10090 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
100a0 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
100b0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
100c0 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
100d0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
100e0 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
100f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
10100 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
10110 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
10120 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
10130 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
10140 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
10150 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
10160 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
10170 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
10180 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
10190 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
101a0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
101b0 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
101c0 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
101d0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
101e0 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
101f0 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
10200 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
10210 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
10220 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
10230 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
10240 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
10250 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
10260 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
10270 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
10280 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
10290 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
102a0 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
102b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
102c0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
102d0 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
102e0 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
102f0 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
10300 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
10310 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
10320 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
10330 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
10340 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
10350 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
10360 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
10370 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
10380 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
10390 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
103a0 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
103b0 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
103c0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
103d0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
103e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
103f0 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
10400 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
10410 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
10420 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
10430 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
10440 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
10450 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
10460 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
10470 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10480 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10490 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
104a0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
104b0 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
104e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
104f0 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
10500 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
10510 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10520 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
10530 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
10540 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
10550 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
10560 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10570 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
10580 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
10590 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
105a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
105b0 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
105c0 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
105d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
105e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
105f0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
10600 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
10610 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
10620 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
10630 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
10640 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
10650 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
10660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10670 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
10680 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
10690 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
106a0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
106b0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
106c0 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
106d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
106e0 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
106f0 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
10700 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
10710 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
10720 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
10730 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
10740 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
10750 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
10760 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
10770 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
10780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10790 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
107a0 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
107b0 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
107c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
107d0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
107e0 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71  _out;..  rc = sq
107f0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10800 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
10810 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
10820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10830 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10840 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
10850 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
10860 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
10870 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
10880 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20  asterPtr = 0;.  
10890 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
108a0 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
108b0 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
108c0 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
108d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
108e0 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
108f0 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
10900 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
10910 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
10920 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
10930 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
10940 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
10950 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
10960 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
10970 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
10980 72 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  r + 1);.    if( 
10990 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
109a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
109b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
109c0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
109d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
109e0 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
109f0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
10a00 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
10a10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10a20 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
10a30 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
10a40 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
10a50 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
10a60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10a70 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10a80 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  out;.    zMaster
10a90 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
10aa0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
10ab0 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
10ac0 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
10ad0 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
10ae0 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
10af0 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
10b00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
10b10 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
10b20 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
10b30 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
10b40 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
10b50 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
10b60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
10b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10b80 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
10b90 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
10ba0 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
10bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
10bc0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
10bd0 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
10be0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10bf0 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
10c00 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
10c10 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
10c20 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
10c30 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
10c40 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
10c50 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
10c60 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
10c70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
10c80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10c90 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
10ca0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
10cb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10cc0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
10cd0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
10ce0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10cf0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
10d00 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
10d10 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
10d20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
10d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d40 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
10d50 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
10d60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
10d70 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
10d80 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
10d90 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
10da0 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
10db0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
10dc0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
10dd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10df0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
10e00 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
10e10 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
10e20 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
10e30 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
10e40 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
10e50 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
10e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
10e70 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
10e80 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
10e90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10ea0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
10eb0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
10ec0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
10ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
10ee0 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
10ef0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
10f00 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
10f10 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
10f20 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
10f30 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
10f40 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
10f50 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
10f60 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
10f70 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
10f80 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
10f90 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
10fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
10fb0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
10fc0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
10fd0 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
10fe0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
10ff0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
11000 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
11010 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11020 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
11030 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
11040 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
11050 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
11060 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
11070 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
11080 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
11090 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
110a0 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
110b0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
110c0 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
110d0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
110e0 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
110f0 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
11100 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
11110 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63   open, or an exc
11120 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e  lusive lock is n
11130 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73  ot.** held, this
11140 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11150 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
11160 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
11170 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e   file is.** chan
11180 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
11190 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
111a0 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
111b0 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a  ). If the file.*
111c0 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  * on disk is cur
111d0 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
111e0 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
111f0 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
11200 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
11210 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
11220 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
11230 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   it might might 
11240 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
11250 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
11260 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
11270 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
11280 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
11290 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
112a0 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
112b0 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
112c0 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
112d0 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
112e0 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
112f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
11300 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
11310 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
11320 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
11330 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
11340 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
11350 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
11360 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
11370 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
11380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11390 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
113a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
113b0 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
113c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
113d0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
113e0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
113f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
11400 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
11410 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
11420 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
11430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11440 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11450 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
11460 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e  LUSIVE && isOpen
11470 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
11480 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
11490 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
114a0 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
114b0 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
114c0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
114d0 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
114e0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
114f0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
11500 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
11510 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
11520 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
11530 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
11540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11550 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
11560 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
11570 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
11580 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
11590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
115a0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
115b0 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
115c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
115d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
115e0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
115f0 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
11600 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
11610 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11630 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
11640 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11650 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11670 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
11680 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
11690 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
116a0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
116b0 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
116c0 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
116d0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
116e0 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
116f0 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
11700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11710 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
11720 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
11730 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
11740 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
11750 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
11760 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
11770 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
11780 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
11790 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
117a0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
117b0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
117c0 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
117d0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
117e0 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
117f0 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
11800 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
11810 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
11820 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
11830 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
11840 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
11850 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
11860 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
11870 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
11880 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
11890 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
118a0 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
118b0 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
118c0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
118d0 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
118e0 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ZE..*/.static vo
118f0 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
11900 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11910 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
11920 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
11930 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
11940 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  e );..  if( !pPa
11950 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
11960 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
11970 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
11980 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
11990 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
119a0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
119b0 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
119c0 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
119d0 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
119e0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
119f0 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
11a00 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  gfault..    */. 
11a10 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
11a20 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
11a30 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
11a40 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69  er->fd);.  }.  i
11a50 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
11a60 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20  rSize<32 ){.    
11a70 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
11a80 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
11a90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
11aa0 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
11ab0 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
11ac0 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
11ad0 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
11ae0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
11af0 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
11b00 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
11b10 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
11b20 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
11b30 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
11b40 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
11b50 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
11b60 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
11b70 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
11b80 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
11b90 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
11ba0 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
11bb0 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
11bc0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
11bd0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
11be0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
11bf0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
11c00 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
11c10 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
11c20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
11c30 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
11c40 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
11c50 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
11c60 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
11c70 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
11c80 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
11c90 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
11ca0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
11cb0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
11cc0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
11cd0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
11ce0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
11cf0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
11d00 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
11d10 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
11d20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
11d30 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
11d40 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11d50 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
11d60 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
11d70 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
11d80 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
11d90 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
11da0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
11db0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
11dc0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
11dd0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
11de0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
11df0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
11e00 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
11e10 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
11e20 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
11e30 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
11e40 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
11e50 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
11e60 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
11e70 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
11e80 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
11e90 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
11ea0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
11eb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
11ec0 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
11ed0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
11ee0 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
11ef0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
11f00 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
11f10 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
11f20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
11f30 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
11f40 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
11f50 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
11f60 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
11f70 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
11f80 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
11f90 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
11fa0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
11fb0 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
11fc0 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
11fd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
11fe0 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
11ff0 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
12000 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
12010 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
12020 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
12030 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
12040 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
12050 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
12060 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
12070 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
12080 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
12090 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
120a0 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
120b0 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
120c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
120d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
120e0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
120f0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
12100 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
12110 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
12120 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
12130 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
12140 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
12150 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
12160 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
12170 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
12180 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
12190 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
121a0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
121b0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
121c0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
121d0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
121e0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
121f0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
12200 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
12210 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
12220 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
12230 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
12240 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
12250 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
12260 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
12270 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
12280 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
12290 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
122a0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
122b0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
122c0 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
122d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
122e0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
122f0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
12300 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
12310 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
12320 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
12330 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
12340 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
12350 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
12360 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
12370 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
12380 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
12390 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
123a0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
123b0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
123c0 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
123d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
123e0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
123f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
12400 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
12410 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
12420 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
12430 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
12440 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
12450 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
12460 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
12470 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
12480 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
12490 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
124a0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
124b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
124c0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
124d0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
124e0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
124f0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
12500 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
12510 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
12520 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
12530 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
12540 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
12550 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
12560 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
12570 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
12580 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
12590 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
125a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
125b0 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
125c0 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
125d0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
125e0 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
125f0 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
12600 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
12610 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
12620 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
12630 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
12640 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
12650 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
12660 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
12670 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12680 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
12690 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
126b0 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
126c0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
126d0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
12700 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
12710 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
12740 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
12750 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
12760 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12770 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
12780 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
12790 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127b0 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
127c0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
127d0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
127e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
127f0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
12800 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
12810 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
12820 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
12830 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
12840 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
12850 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
12860 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
12870 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
12880 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
12890 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
128a0 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46  lback */..  /* F
128b0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
128c0 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
128d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
128e0 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
128f0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
12900 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
12910 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
12920 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
12930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12940 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
12950 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
12960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12970 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
12980 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
12990 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
129a0 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
129b0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
129c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
129d0 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
129e0 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
129f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
12a00 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
12a10 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
12a20 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
12a30 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
12a40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
12a50 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
12a60 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
12a70 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
12a80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
12a90 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
12aa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
12ab0 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
12ac0 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
12ad0 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
12ae0 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
12af0 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
12b00 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
12b10 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
12b20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
12b30 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
12b40 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
12b50 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
12b60 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65    **  mxPathname
12b70 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69   is 512, which i
12b80 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
12b90 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61  e minimum allowa
12ba0 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66  ble value.  ** f
12bb0 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a  or pageSize..  *
12bc0 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
12bd0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
12be0 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
12bf0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
12c00 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
12c10 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
12c20 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
12c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12c40 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
12c50 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
12c60 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
12c70 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
12c80 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
12c90 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
12ca0 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
12cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
12cc0 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
12cd0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
12ce0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
12cf0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
12d00 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
12d10 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68   isHot;..  /* Th
12d20 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
12d30 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61  es either when a
12d40 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
12d50 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72  ) or .  ** pager
12d60 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
12d70 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ge() call return
12d80 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
12d90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20   an IO error .  
12da0 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f  ** occurs. .  */
12db0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
12dc0 20 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 20     int isUnsync 
12dd0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  = 0;..    /* Rea
12de0 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
12df0 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
12e00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
12e10 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
12e20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
12e30 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
12e40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12e50 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
12e60 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
12e70 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
12e80 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
12e90 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
12ea0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
12eb0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
12ec0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
12ed0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
12ee0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
12ef0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
12f00 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
12f10 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
12f20 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
12f30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12f40 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
12f50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
12f60 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
12f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
12f90 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
12fa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12fb0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
12fc0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
12fd0 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
12fe0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
12ff0 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
13000 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
13010 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13020 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
13030 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
13040 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
13050 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
13060 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
13070 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
13080 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
13090 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
130a0 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
130b0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
130c0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
130d0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
130e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
130f0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
13100 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13110 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
13120 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
13130 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13140 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
13150 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
13160 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
13170 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
13180 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
13190 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
131a0 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
131b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
131c0 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
131d0 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
131e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
131f0 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
13200 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
13210 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
13220 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
13230 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
13240 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
13250 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
13260 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
13270 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
13280 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
13290 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
132a0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
132b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
132c0 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
132d0 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
132e0 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
132f0 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
13300 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
13310 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
13320 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
13330 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
13340 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
13350 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
13360 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
13370 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
13380 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
13390 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
133a0 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
133b0 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
133c0 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
133d0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
133e0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
133f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13400 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
13410 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
13420 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
13430 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
13440 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
13450 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
13460 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
13470 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
13480 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13490 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
134a0 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
134b0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
134c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
134d0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
134e0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
134f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13500 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
13510 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
13520 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
13530 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
13540 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
13550 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20   isUnsync = 1;. 
13560 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
13570 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
13580 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
13590 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
135a0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
135b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
135c0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
135d0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
135e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
135f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13600 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13610 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
13620 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
13630 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
13640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13660 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
13670 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
13680 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
13690 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
136a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
136b0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
136c0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
136d0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
136e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
136f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
13700 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
13710 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
13720 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
13730 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
13740 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
13750 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
13760 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
13770 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
13780 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13790 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
137a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
137b0 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e  pPager,1,isUnsyn
137c0 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  c,&pPager->journ
137d0 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20  alOff,0,0);.    
137e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
137f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
13800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
13810 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
13820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13830 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13840 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
13850 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
13860 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
13870 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
13880 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
13890 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71  e to rollback, q
138a0 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  uit and return t
138b0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
138c0 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69     ** code.  Thi
138d0 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
138e0 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
138f0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a  the error state.
13900 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
13910 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20  that no further 
13920 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e  harm will be don
13930 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20  e.  Perhaps the 
13940 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a  next.          *
13950 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d  * process to com
13960 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20  e along will be 
13970 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
13980 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
13990 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
139a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
139b0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
139c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
139d0 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
139e0 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
139f0 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
13a00 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69  ck:.  /* Followi
13a10 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
13a20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13a30 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20   should be back 
13a40 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  in its original.
13a50 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72    ** state prior
13a60 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
13a70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13a80 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a  , so invoke the.
13a90 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54    ** SQLITE_FCNT
13aa0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66  L_DB_UNCHANGED f
13ab0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile-control meth
13ac0 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  od to disable th
13ad0 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e  e.  ** assertion
13ae0 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
13af0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
13b00 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f  s modified..  */
13b10 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70  .  assert(.    p
13b20 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
13b30 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71  ods==0 ||.    sq
13b40 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
13b50 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  ol(pPager->fd,SQ
13b60 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
13b70 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49  CHANGED,0)>=SQLI
13b80 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a  TE_OK.  );..  /*
13b90 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
13ba0 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
13bb0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
13bc0 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
13bd0 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
13be0 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
13bf0 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
13c00 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
13c10 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
13c20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
13c30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13c40 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
13c50 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
13c60 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
13c70 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
13c80 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
13c90 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
13ca0 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
13cb0 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
13cc0 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
13cd0 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
13ce0 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
13cf0 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
13d00 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
13d10 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
13d20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
13d30 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
13d40 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
13d50 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
13d60 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
13d70 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
13d80 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
13d90 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
13da0 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
13db0 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
13dc0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
13dd0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
13de0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
13df0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
13e00 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
13e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13e20 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
13e30 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
13e40 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
13e50 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
13e60 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
13e70 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
13e80 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
13e90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
13ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
13eb0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
13ec0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
13ed0 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 70  ->noSync==0 && p
13ee0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
13ef0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
13f00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13f10 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
13f20 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
13f30 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69  _flags);.  }.  i
13f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13f50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
13f60 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
13f70 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
13f80 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20  er[0]!='\0');.  
13f90 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
13fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
13fb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13fc0 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
13fd0 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
13fe0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
13ff0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
14000 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
14010 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
14020 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
14030 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
14040 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
14050 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
14060 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
14070 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
14080 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
14090 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
140a0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
140b0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
140c0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
140d0 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
140e0 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
140f0 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
14100 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
14110 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
14120 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
14130 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
14140 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
14150 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
14160 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
14170 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
14180 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
14190 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
141a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
141b0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
141c0 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
141d0 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
141e0 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
141f0 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
14200 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
14210 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
14220 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
14230 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
14240 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
14250 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
14260 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
14270 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
14280 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
14290 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
142a0 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
142b0 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
142c0 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
142d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
142e0 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
142f0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
14300 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
14310 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
14320 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
14330 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
14340 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
14350 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
14360 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
14370 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14380 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
14390 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
143a0 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
143b0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
143c0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
143d0 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
143e0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
143f0 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
14400 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
14410 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
14420 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
14430 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
14440 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
14450 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
14460 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
14470 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
14480 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
14490 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
144a0 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
144b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
144c0 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
144d0 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
144e0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
144f0 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
14500 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
14510 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
14520 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
14530 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
14540 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
14550 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
14560 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
14570 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
14580 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
14590 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
145a0 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
145b0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
145c0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
145d0 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
145e0 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
145f0 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
14600 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
14610 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
14620 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
14630 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
14640 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
14650 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
14660 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
14670 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
14680 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
14690 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
146a0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
146b0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
146c0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
146d0 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
146e0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
146f0 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
14700 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
14710 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
14720 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
14730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
14740 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
14750 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
14760 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
14770 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
14780 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
14790 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
147a0 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
147b0 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
147c0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
147d0 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
147e0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
147f0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
14800 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
14810 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
14820 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
14830 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
14840 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
14850 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
14860 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
14870 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
14880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14890 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
148a0 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
148b0 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
148c0 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
148d0 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148f0 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
14900 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14910 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
14920 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
14930 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
14940 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
14950 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
14960 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
14970 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
14980 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14990 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
149a0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
149b0 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
149c0 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
149d0 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
149e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
149f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
14a00 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  HARED );..  /* A
14a10 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
14a20 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
14a30 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
14a40 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
14a50 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
14a60 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
14a70 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
14a80 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
14a90 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
14aa0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
14ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14ac0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
14ad0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
14ae0 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
14af0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
14b00 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
14b10 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
14b20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
14b30 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
14b40 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
14b50 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
14b60 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
14b70 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
14b80 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 55 73  igSize;..  /* Us
14b90 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
14ba0 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
14bb0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
14bc0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
14bd0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
14be0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
14bf0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
14c00 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
14c10 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
14c20 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
14c30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14c40 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
14c50 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
14c60 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
14c70 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
14c80 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
14c90 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
14ca0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
14cb0 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
14cc0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
14cd0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
14ce0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
14cf0 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
14d00 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
14d10 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
14d20 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
14d30 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
14d40 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
14d50 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
14d60 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
14d70 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
14d80 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
14d90 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
14da0 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
14db0 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
14dc0 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
14dd0 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
14de0 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
14df0 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
14e00 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
14e10 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
14e20 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
14e30 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
14e40 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
14e50 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
14e60 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
14e70 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
14e80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
14e90 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
14ea0 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
14eb0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
14ec0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14ed0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
14ee0 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
14ef0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
14f00 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
14f10 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65  er, 1, 0, &pPage
14f20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
14f30 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a  , pDone);.    }.
14f40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
14f50 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
14f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
14f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14f80 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
14f90 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
14fa0 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
14fb0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
14fc0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
14fd0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
14fe0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
14ff0 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
15000 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
15010 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
15020 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
15030 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
15040 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
15050 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
15060 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
15070 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
15080 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
15090 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
150a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
150b0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
150c0 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
150d0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
150e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
150f0 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
15100 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
15110 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
15120 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
15130 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
15140 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
15150 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
15160 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
15170 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
15180 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15190 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
151a0 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
151b0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
151c0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
151d0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
151e0 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
151f0 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
15200 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
15210 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
15220 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
15230 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
15240 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
15250 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15260 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
15270 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
15280 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
15290 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
152a0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
152b0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
152c0 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
152d0 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
152e0 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
152f0 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
15300 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
15310 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
15320 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
15330 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
15340 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
15350 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
15360 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
15370 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
15380 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
15390 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  , 0, &pPager->jo
153a0 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f  urnalOff, 1, pDo
153b0 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
153c0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
153d0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
153e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
153f0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
15400 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
15410 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
15420 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
15430 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
15440 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
15450 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
15460 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
15470 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
15480 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
15490 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
154a0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
154b0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
154c0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
154d0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
154e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
154f0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
15500 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
15510 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15520 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
15530 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
15540 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
15550 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15560 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
15570 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
15580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15590 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
155a0 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
155b0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
155c0 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  ==ii*(4+pPager->
155d0 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
155e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
155f0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15600 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f  pPager, 0, 0, &o
15610 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29  ffset, 1, pDone)
15620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15630 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15640 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
15650 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
15660 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
15670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15680 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
15690 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
156a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
156b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
156c0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
156d0 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
156e0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
156f0 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
15700 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15710 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
15720 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
15730 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
15740 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
15750 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
15760 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
15770 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
15780 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
15790 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
157a0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
157b0 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
157c0 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
157d0 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
157e0 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
157f0 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
15800 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
15810 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
15820 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
15830 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
15840 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
15850 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
15860 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
15870 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
15880 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
15890 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
158a0 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
158b0 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
158c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
158d0 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
158e0 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
158f0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
15900 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
15910 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
15920 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
15930 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
15940 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
15950 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
15960 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
15970 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
15980 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
15990 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
159a0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
159b0 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
159c0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
159d0 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
159e0 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
159f0 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
15a00 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
15a10 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
15a20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
15a30 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
15a40 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
15a50 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
15a60 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
15a70 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
15a80 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
15a90 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
15aa0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15ab0 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
15ac0 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
15ad0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
15ae0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
15af0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
15b00 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
15b10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15b20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
15b30 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
15b40 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
15b50 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
15b60 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
15b70 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
15b80 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
15b90 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
15ba0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
15bb0 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
15bc0 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
15bd0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
15be0 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
15bf0 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
15c00 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
15c10 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
15c20 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
15c30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15c40 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
15c50 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
15c60 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
15c70 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
15c80 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
15c90 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
15ca0 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
15cb0 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
15cc0 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
15cd0 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
15ce0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
15cf0 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
15d00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
15d10 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
15d20 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
15d30 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
15d40 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
15d50 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
15d60 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62  >sync_flags = (b
15d70 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45  FullFsync?SQLITE
15d80 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54  _SYNC_FULL:SQLIT
15d90 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
15da0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
15db0 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
15dc0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
15dd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
15de0 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
15df0 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
15e00 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
15e10 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
15e20 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
15e30 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
15e40 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
15e50 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
15e60 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
15e70 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
15e80 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
15e90 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
15ea0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
15eb0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
15ec0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
15ed0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
15ee0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
15ef0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
15f00 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
15f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15f20 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
15f30 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
15f40 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
15f50 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
15f60 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
15f70 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
15f80 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
15f90 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
15fa0 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
15fb0 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
15fc0 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
15fd0 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
15fe0 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
15ff0 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
16000 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
16010 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16020 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16030 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
16040 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
16050 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
16060 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
16070 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16080 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
16090 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
160a0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
160b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
160c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
160d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
160e0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
160f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
16100 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
16110 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
16120 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
16130 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
16140 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
16150 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
16160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16170 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16180 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16190 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
161a0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
161b0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
161c0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
161d0 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
161e0 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
161f0 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
16200 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
16210 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
16220 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16230 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
16240 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16250 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
16260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
16270 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
16280 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
16290 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
162a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
162b0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
162c0 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
162d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
162e0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
162f0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
16300 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
16310 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
16320 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
16330 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
16340 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
16350 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
16360 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
16370 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
16380 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
16390 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
163a0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
163b0 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
163c0 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
163d0 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
163e0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
163f0 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
16400 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
16410 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
16420 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
16430 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
16440 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
16450 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
16460 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
16470 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
16480 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
16490 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
164b0 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
164c0 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
164d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16500 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
16510 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
16520 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
16530 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
16540 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
16550 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
16560 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
16570 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
16580 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
16590 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
165a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
165b0 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
165c0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
165d0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
165e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
165f0 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
16600 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
16610 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
16620 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
16630 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
16640 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
16650 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
16660 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
16670 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
16680 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
16690 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
166c0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
166d0 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
166e0 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
166f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
16700 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
16710 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
16720 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16740 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
16750 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
16760 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67  r */.){  .  pPag
16770 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
16780 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
16790 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
167a0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
167b0 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a  syHandlerArg;.}.
167c0 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68  ./*.** Report th
167d0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73  e current page s
167e0 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ize and number o
167f0 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
16800 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20   back.** to the 
16810 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66  codec..*/.#ifdef
16820 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
16830 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  C.static void pa
16840 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61  gerReportSize(Pa
16850 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
16860 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
16870 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20  ecSizeChng ){.  
16880 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
16890 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d  SizeChng(pPager-
168a0 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d  >pCodec, pPager-
168b0 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65        (int)pPage
168e0 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  r->nReserve);.  
168f0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
16900 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  ne pagerReportSi
16910 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d  ze(X)     /* No-
16920 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  op if we do not 
16930 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20  support a codec 
16940 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
16950 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
16960 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
16970 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
16980 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
16990 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
169a0 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
169b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
169c0 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
169d0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
169e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
169f0 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
16a00 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
16a10 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
16a20 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
16a30 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
16a40 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
16a50 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
16a60 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45  ORRUPT or SQLITE
16a70 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
16a80 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
16a90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16aa0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
16ab0 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
16ac0 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
16ad0 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
16ae0 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
16af0 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
16b00 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
16b10 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
16b20 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
16b30 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
16b40 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
16b50 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
16b60 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
16b70 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
16b80 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
16b90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
16ba0 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
16bb0 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
16bc0 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
16bd0 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
16be0 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
16bf0 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
16c00 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
16c10 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
16c20 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
16c30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16c40 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
16c50 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
16c60 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
16c70 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
16c80 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
16c90 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
16ca0 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
16cb0 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
16cc0 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
16cd0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
16ce0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
16cf0 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
16d00 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
16d10 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
16d20 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
16d30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
16d40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
16d50 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
16d60 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
16d70 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
16d80 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
16d90 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
16da0 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
16db0 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
16dc0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
16dd0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
16de0 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
16df0 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
16e00 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
16e10 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
16e20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
16e30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
16e40 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
16e50 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
16e60 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
16e70 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
16e80 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
16e90 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65  ager, u16 *pPage
16ea0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
16eb0 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
16ec0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
16ed0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
16ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36  TE_OK ){.    u16
16ef0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
16f00 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
16f10 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
16f20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
16f30 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
16f40 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
16f50 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20  IZE) );.    if( 
16f60 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
16f70 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
16f80 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20  ize==0).     && 
16f90 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
16fa0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
16fb0 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 20  Cache)==0 .     
16fc0 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
16fd0 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
16fe0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 29  >pageSize .    )
16ff0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
17000 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
17010 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
17020 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17030 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
17040 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17050 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
17060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67  lse{.        pag
17070 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17080 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
17090 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
170a0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 73  eSize;.        s
170b0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
170c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
170d0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
170e0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
170f0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  New;.        sql
17100 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
17110 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
17120 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
17130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17140 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d      *pPageSize =
17150 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61   (u16)pPager->pa
17160 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  geSize;.    if( 
17170 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
17180 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
17190 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
171a0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
171b0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
171c0 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
171d0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
171e0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
171f0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17200 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
17210 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17220 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
17230 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
17240 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
17250 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
17260 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
17270 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
17280 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
17290 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
172a0 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
172b0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
172c0 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
172d0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
172e0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
172f0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
17300 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
17310 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
17320 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
17330 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
17340 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
17350 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
17360 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
17370 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
17380 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
17390 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
173a0 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
173b0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
173c0 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
173d0 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
173e0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
173f0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
17400 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
17410 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
17420 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
17430 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
17440 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
17450 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
17460 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
17470 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
17480 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
17490 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
174a0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
174b0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
174c0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
174d0 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
174e0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
174f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
17500 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
17510 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
17520 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
17530 6e 50 61 67 65 3b 0a 20 20 69 66 28 20 6d 78 50  nPage;.  if( mxP
17540 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
17550 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
17560 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
17570 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17580 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
17590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
175a0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61  ger->mxPgno>=nPa
175b0 67 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ge );.  return p
175c0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
175d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
175e0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
175f0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
17600 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
17610 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
17620 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
17630 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
17640 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
17650 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
17660 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
17670 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
17680 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
17690 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
176a0 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
176b0 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
176c0 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
176d0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
176e0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
176f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17700 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
17710 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
17720 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
17730 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
17740 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
17750 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
17760 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
17770 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
17780 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
17790 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
177a0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
177b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
177c0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
177d0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
177e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
177f0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
17800 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
17810 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
17820 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
17830 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
17840 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17850 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
17860 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
17870 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
17880 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
17890 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
178a0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
178b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
178c0 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
178d0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
178e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
178f0 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
17900 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
17910 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
17920 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
17930 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
17940 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
17950 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
17960 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
17970 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
17980 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
17990 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
179a0 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
179b0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
179c0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
179d0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
179e0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
179f0 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
17a00 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
17a10 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
17a20 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
17a30 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
17a40 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
17a50 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
17a60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17a70 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
17a80 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
17a90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
17aa0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
17ab0 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
17ac0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
17ad0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
17ae0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
17af0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
17b00 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
17b10 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
17b20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
17b30 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
17b40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
17b50 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
17b60 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
17b70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
17b80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
17b90 46 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73  File );.  if( is
17ba0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
17bb0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
17bc0 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
17bd0 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
17be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17bf0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
17c00 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
17c10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17c20 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
17c30 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
17c40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17c50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17c60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17c70 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
17c80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17c90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17ca0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ile associated .
17cb0 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20  ** with pPager. 
17cc0 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69  Normally, this i
17cd0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  s calculated as 
17ce0 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f  (<db file size>/
17cf0 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a  <page-size>)..**
17d00 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
17d10 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
17d20 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
17d30 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
17d40 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
17d50 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
17d60 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a  1 page file..**.
17d70 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
17d80 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  is in error stat
17d90 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
17da0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
17db0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f  then the.** erro
17dc0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
17dd0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
17de0 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20  nd *pnPage left 
17df0 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a  unchanged. Or,.*
17e00 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79  * if the file sy
17e10 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71  stem has to be q
17e20 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73  ueried for the s
17e30 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
17e40 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79  and.** the query
17e50 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73   attempt returns
17e60 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68   an IO error, th
17e70 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
17e80 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
17e90 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
17ea0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
17eb0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
17ec0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
17ed0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e  successful, then
17ee0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17ef0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
17f00 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  nPage is set to 
17f10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
17f20 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17f30 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
17f40 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17f50 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
17f60 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
17f70 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
17f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
17f90 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
17fa0 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
17fb0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
17fc0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
17fd0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
17fe0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
17ff0 63 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  code. */.  if( N
18000 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
18010 43 6f 64 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Code) ){.    ret
18020 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
18030 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ode;.  }..  /* D
18040 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d  etermine the num
18050 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18060 74 68 65 20 66 69 6c 65 2e 20 53 74 6f 72 65 20  the file. Store 
18070 74 68 69 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a  this in nPage. *
18080 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
18090 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20  dbSizeValid ){. 
180a0 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65     nPage = pPage
180b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c  r->dbSize;.  }el
180c0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20  se{.    int rc; 
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 2f 2a 20 45 72 72 6f 72 20 72 65 74 75 72 6e 65  /* Error returne
180f0 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28  d by OsFileSize(
18100 29 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d  ) */.    i64 n =
18110 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18120 20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20 69 6e   /* File size in
18130 20 62 79 74 65 73 20 72 65 74 75 72 6e 65 64 20   bytes returned 
18140 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  by OsFileSize() 
18150 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
18160 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18170 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
18180 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
18190 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
181a0 3e 66 64 29 20 26 26 20 28 30 20 21 3d 20 28 72  >fd) && (0 != (r
181b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
181c0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
181d0 2c 20 26 6e 29 29 29 20 29 7b 0a 20 20 20 20 20  , &n))) ){.     
181e0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
181f0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
18200 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18210 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
18220 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
18230 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  ze ){.      nPag
18240 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
18250 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
18260 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65  (Pgno)(n / pPage
18270 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
18280 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
18290 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
182a0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
182b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
182c0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70  = nPage;.      p
182d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
182e0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
182f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
18300 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  alid = 1;.    }.
18310 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
18320 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
18330 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18340 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
18350 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63  than the .  ** c
18360 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75  onfigured maximu
18370 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20  m pager number, 
18380 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  increase the all
18390 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20  owed limit so.  
183a0 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ** that the file
183b0 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20   can be read..  
183c0 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70  */.  if( nPage>p
183d0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
183e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
183f0 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67  gno = (Pgno)nPag
18400 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  e;.  }..  /* Set
18410 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
18420 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  able and return 
18430 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 2a  SQLITE_OK */.  *
18440 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
18450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18460 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  OK;.}.../*.** Tr
18470 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
18480 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
18490 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
184a0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
184b0 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
184c0 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
184d0 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
184e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
184f0 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
18500 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
18510 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
18520 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
18530 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
18540 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
18550 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
18560 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
18570 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
18580 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
18590 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
185a0 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
185b0 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
185c0 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
185d0 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
185e0 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
185f0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
18600 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
18610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18620 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
18630 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
18640 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
18650 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
18660 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
18670 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
18680 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
18690 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
186a0 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
186b0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
186c0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
186d0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
186e0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
186f0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
18700 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
18730 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
18740 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
18750 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
18760 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
18770 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
18780 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
18790 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
187a0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
187b0 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
187c0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
187d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
187e0 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
187f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
18800 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
18810 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
18820 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
18830 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
18840 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20 2a 2a 20 6d  known. It.  ** m
18850 75 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ust not have bee
18860 6e 20 6d 6f 64 69 66 69 65 64 20 61 74 20 74 68  n modified at th
18870 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 20  is point..  */. 
18880 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18890 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
188a0 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
188b0 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
188c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
188d0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
188e0 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
188f0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30  r->dbModified==0
18900 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
18910 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
18920 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
18930 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
18940 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
18950 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
18960 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
18970 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74  nsistions that t
18980 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
18990 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
189a0 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
189b0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
189c0 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
189d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
189e0 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
189f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
18a00 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
18a10 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
18a20 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
18a30 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26  =PAGER_UNLOCK &&
18a40 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52   locktype==PAGER
18a50 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
18a60 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  || (pPager->stat
18a70 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
18a80 44 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  D && locktype==P
18a90 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a  AGER_EXCLUSIVE).
18aa0 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67    );..  if( pPag
18ab0 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
18ac0 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ype ){.    rc = 
18ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
18ae0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
18af0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18b00 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
18b10 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
18b20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
18b30 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
18b40 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
18b50 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
18b60 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20  ndlerArg) );.   
18b70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18b80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
18b90 65 72 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29  er->state = (u8)
18ba0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
18bb0 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
18bc0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
18bd0 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20   locktype)).    
18be0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
18bf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
18c00 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
18c10 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
18c20 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
18c30 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
18c40 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
18c50 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
18c60 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
18c70 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
18c80 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
18c90 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
18ca0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
18cb0 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
18cc0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
18cd0 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
18ce0 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
18cf0 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
18d00 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
18d10 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
18d20 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
18d30 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
18d40 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
18d50 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
18d60 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
18d70 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
18d80 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
18d90 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
18da0 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
18db0 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
18dc0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
18dd0 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
18de0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
18df0 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
18e00 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
18e10 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
18e20 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
18e30 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
18e40 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
18e50 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
18e60 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
18e70 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
18e80 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
18e90 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
18ea0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
18eb0 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
18ec0 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
18ed0 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
18ee0 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
18ef0 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
18f00 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  our would be to 
18f10 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
18f20 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
18f30 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
18f40 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
18f50 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
18f60 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
18f70 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
18f80 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
18f90 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
18fa0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
18fb0 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
18fc0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
18fd0 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
18fe0 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
18ff0 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
19000 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
19010 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
19020 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
19030 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
19040 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
19050 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
19060 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
19070 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
19080 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
19090 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
190a0 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
190b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
190c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
190d0 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
190e0 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
190f0 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
19100 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
19110 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
19120 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
19130 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
19140 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
19150 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
19160 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
19170 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
19180 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
19190 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
191a0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
191b0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
191c0 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
191d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
191e0 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
191f0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
19200 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
19210 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
19220 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
19230 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
19240 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
19250 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
19260 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
19270 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
19280 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
19290 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
192a0 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
192b0 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
192c0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
192d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
192e0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ommitted..*/.voi
192f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
19300 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
19310 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
19320 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
19330 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
19340 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73 65 72  Valid );.  asser
19350 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
19360 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
19370 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
19380 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
19390 56 45 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  VED );.  pPager-
193a0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
193b0 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  .  assertTruncat
193c0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
193d0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  er);.}../*.** Sh
193e0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
193f0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
19400 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
19410 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
19420 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
19430 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
19440 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
19450 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
19460 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
19470 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
19480 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
19490 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
194a0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
194b0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
194c0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
194d0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
194e0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
194f0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
19500 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
19510 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
19520 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
19530 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
19540 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
19550 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
19560 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
19570 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19580 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
19590 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
195a0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
195b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
195c0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
195d0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
195e0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
195f0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
19600 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
19610 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
19620 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
19630 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19640 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
19650 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 64 69 73   *pPager){.  dis
19660 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
19670 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
19680 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
19690 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67  Malloc();.  pPag
196a0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
196b0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
196c0 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  siveMode = 0;.  
196d0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
196e0 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
196f0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
19700 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
19710 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
19720 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48  t Pager.journalH
19730 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65  dr to -1 for the
19740 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20   benefit of the 
19750 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
19760 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68   .    ** call wh
19770 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20  ich may be made 
19780 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
19790 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
197a0 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20  ck(). If it.    
197b0 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68  ** is not -1, th
197c0 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  en the unsynced 
197d0 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70  portion of an op
197e0 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
197f0 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c  may.    ** be pl
19800 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
19810 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
19820 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
19830 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20  occurs while.   
19840 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
19850 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
19860 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ase may become c
19870 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20  orrupt..    */. 
19880 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
19890 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20  alHdr = -1;.    
198a0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
198b0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
198c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
198d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
198e0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
198f0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
19900 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
19910 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
19920 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
19930 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
19940 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
19950 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
19960 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
19970 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
19980 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
19990 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ce);.  sqlite3Pc
199a0 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
199b0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
199c0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
199d0 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
199e0 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
199f0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
19a00 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
19a10 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
19a20 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
19a30 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
19a40 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
19a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
19a60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
19a70 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
19a80 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
19a90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
19aa0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
19ab0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
19ac0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
19ad0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
19ae0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
19af0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
19b00 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
19b10 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
19b20 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
19b30 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
19b40 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
19b50 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
19b60 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
19b70 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
19b80 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
19b90 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
19ba0 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
19bb0 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
19bc0 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
19bd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
19be0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
19bf0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
19c00 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
19c10 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
19c20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
19c30 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
19c40 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
19c50 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
19c60 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
19c70 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
19c80 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
19c90 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
19ca0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
19cb0 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
19cc0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
19cd0 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68  not set, then th
19ce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
19cf0 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  .** no-op. Other
19d00 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
19d10 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
19d20 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
19d30 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65  -mode.** and the
19d40 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
19d50 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74  ristics of the t
19d60 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
19d70 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
19d80 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
19d90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
19da0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
19db0 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
19dc0 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
19dd0 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
19de0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
19df0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
19e00 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
19e10 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
19e20 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
19e30 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
19e40 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
19e50 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
19e60 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
19e70 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
19e80 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
19e90 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
19ea0 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
19eb0 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
19ec0 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
19ed0 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
19ee0 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
19ef0 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
19f00 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
19f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
19f20 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
19f30 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
19f40 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
19f50 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
19f60 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
19f70 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
19f80 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
19f90 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
19fa0 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
19fb0 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
19fc0 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
19fd0 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
19fe0 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
19ff0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
1a000 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
1a010 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
1a020 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
1a030 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
1a040 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
1a050 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
1a060 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
1a070 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
1a080 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
1a090 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
1a0a0 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61    }.**.** The Pa
1a0b0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
1a0c0 67 20 69 73 20 6e 65 76 65 72 20 62 65 20 73 65  g is never be se
1a0d0 74 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  t for temporary 
1a0e0 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a  files, or any.**
1a0f0 20 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20   file operating 
1a100 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  in no-sync mode 
1a110 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65  (Pager.noSync se
1a120 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a  t to non-zero)..
1a130 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1a140 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
1a150 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
1a160 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
1a170 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
1a180 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
1a190 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
1a1a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
1a1b0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
1a1c0 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
1a1d0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
1a1e0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
1a1f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
1a200 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1a210 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
1a220 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1a230 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
1a240 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
1a250 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
1a260 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1a270 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1a280 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
1a290 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1a2a0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
1a2b0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1a2e0 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  code */.      co
1a2f0 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
1a300 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1a310 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1a320 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
1a330 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1a340 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
1a350 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1a360 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1a370 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
1a380 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
1a390 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
1a3a0 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
1a3b0 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
1a3c0 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
1a3d0 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
1a3e0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
1a3f0 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
1a400 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
1a410 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1a420 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
1a430 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
1a440 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
1a450 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
1a460 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
1a470 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
1a480 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
1a490 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
1a4a0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1a4b0 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
1a4c0 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
1a4d0 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
1a4e0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
1a4f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
1a500 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
1a510 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  s transaction), 
1a520 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70  and a crash or p
1a530 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20  ower-failure .  
1a540 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20        ** occurs 
1a550 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70  after nRec is up
1a560 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  dated but before
1a570 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1a580 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20   writes .       
1a590 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73   ** anything els
1a5a0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1a5b0 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74   file (or commit
1a5c0 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73  s/rolls back its
1a5d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
1a5e0 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20  nsaction), then 
1a5f0 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d  SQLite may becom
1a600 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20  e confused when 
1a610 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  doing the .     
1a620 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
1a630 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  l rollback follo
1a640 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49  wing recovery. I
1a650 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20  t may roll back 
1a660 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  all.        ** o
1a670 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
1a680 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72  ns data, then pr
1a690 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67  oceed to rolling
1a6a0 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20   back the old,. 
1a6b0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66         ** out-of
1a6c0 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20  -date data that 
1a6d0 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61  follows it. Data
1a6e0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1a6f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1a700 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61      ** To work a
1a710 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74  round this, if t
1a720 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a730 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63  does appear to c
1a740 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a  ontain.        *
1a750 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  * a valid header
1a760 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72   following Pager
1a770 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65  .journalOff, the
1a780 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20  n write a 0x00. 
1a790 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74         ** byte t
1a7a0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
1a7b0 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20  t to prevent it 
1a7c0 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67  from being recog
1a7d0 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  nized..        *
1a7e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72  *.        ** Var
1a7f0 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66  iable iNextHdrOf
1a800 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
1a810 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69  he offset at whi
1a820 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  ch this.        
1a830 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68  ** problematic h
1a840 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72  eader will occur
1a850 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  , if it exists. 
1a860 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a  aMagic is used .
1a870 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20          ** as a 
1a880 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
1a890 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20   to inspect the 
1a8a0 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20  first couple of 
1a8b0 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20  bytes of.       
1a8c0 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61   ** the potentia
1a8d0 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  l journal header
1a8e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1a8f0 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64       i64 iNextHd
1a900 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  rOffset;.       
1a910 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 09   u8 aMagic[8];..
1a920 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
1a930 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1a940 2b 34 5d 3b 0a 0a 09 6d 65 6d 63 70 79 28 7a 48  +4];...memcpy(zH
1a950 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
1a960 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
1a970 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 09 70  urnalMagic));..p
1a980 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
1a990 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
1a9a0 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
1a9b0 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
1a9c0 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
1a9d0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
1a9e0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1a9f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1aa00 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1aa10 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
1aa20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
1aa30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1aa40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
1aa50 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
1aa60 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
1aa70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
1aa80 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
1aa90 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
1aaa0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1aab0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1aac0 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
1aad0 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
1aae0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
1aaf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1ab00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1ab10 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
1ab20 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1ab30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ab40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1ab50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1ab60 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
1ab70 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1ab80 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
1ab90 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
1aba0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
1abb0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
1abc0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
1abd0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
1abe0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
1abf0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
1ac00 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
1ac10 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
1ac20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
1ac30 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
1ac40 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
1ac50 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
1ac60 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
1ac70 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
1ac80 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
1ac90 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
1aca0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
1acb0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
1acc0 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
1acd0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
1ace0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
1acf0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
1ad00 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
1ad10 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
1ad20 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
1ad30 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
1ad40 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
1ad50 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
1ad60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1ad70 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
1ad80 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
1ad90 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
1ada0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
1adb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1adc0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1add0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
1ade0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1adf0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
1ae00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1ae10 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
1ae20 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1ae30 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
1ae40 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
1ae50 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
1ae60 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
1ae70 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1ae80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1ae90 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
1aea0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1aeb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1aec0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1aed0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
1aee0 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
1aef0 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
1af00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1af10 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  dr));.        rc
1af20 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1af30 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
1af40 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
1af50 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
1af60 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  der), pPager->jo
1af70 75 72 6e 61 6c 48 64 72 0a 09 29 3b 0a 20 20 20  urnalHdr..);.   
1af80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1af90 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1afa0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1afb0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
1afc0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1afd0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
1afe0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1aff0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
1b000 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1b010 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
1b020 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1b030 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1b040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b050 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
1b060 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1b070 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20  >sync_flags| .  
1b080 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
1b090 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c  >sync_flags==SQL
1b0a0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
1b0b0 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1b0c0 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
1b0d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b0e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b0f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b100 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1b110 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
1b120 61 73 20 6a 75 73 74 20 73 75 63 63 65 73 73 66  as just successf
1b130 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 53 65 74  ully synced. Set
1b140 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1b150 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20  .    ** to zero 
1b160 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 50 47  and clear the PG
1b170 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
1b180 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73  ag on all pagess
1b190 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
1b1a0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
1b1b0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
1b1c0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
1b1d0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  1;.    sqlite3Pc
1b1e0 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
1b1f0 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
1b200 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  he);.  }..  retu
1b210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b220 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
1b230 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
1b240 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
1b250 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1b260 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
1b270 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
1b280 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
1b290 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
1b2a0 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
1b2b0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
1b2c0 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
1b2d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b2e0 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
1b2f0 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
1b300 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
1b310 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
1b320 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
1b330 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
1b340 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
1b350 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
1b360 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
1b370 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
1b380 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1b390 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
1b3a0 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
1b3b0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1b3c0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
1b3d0 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
1b3e0 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
1b3f0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
1b400 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
1b410 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
1b420 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
1b430 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
1b440 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
1b450 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b460 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
1b470 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
1b480 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
1b490 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
1b4a0 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
1b4b0 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
1b4c0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
1b4d0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
1b4e0 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
1b4f0 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
1b500 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
1b510 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
1b520 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
1b530 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
1b540 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
1b550 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
1b560 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1b570 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
1b580 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
1b590 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
1b5a0 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
1b5b0 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
1b5c0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
1b5d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
1b5e0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
1b5f0 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
1b600 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
1b610 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
1b620 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
1b630 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
1b640 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
1b650 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
1b660 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
1b670 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
1b680 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
1b690 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
1b6a0 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
1b6b0 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
1b6c0 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
1b6d0 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
1b6e0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1b6f0 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
1b700 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
1b710 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
1b720 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1b730 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
1b740 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
1b750 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
1b760 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1b770 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
1b780 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
1b790 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1b7a0 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
1b7b0 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
1b7c0 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
1b7d0 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
1b7e0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1b7f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1b800 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1b810 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
1b820 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
1b830 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
1b840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1b850 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1b860 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1b890 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 4e  code */..  if( N
1b8a0 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29 20 29  EVER(pList==0) )
1b8b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b8c0 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
1b8d0 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
1b8e0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
1b8f0 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
1b900 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
1b910 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
1b920 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
1b930 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
1b940 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
1b950 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1b960 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
1b970 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61  g.  ** call is a
1b980 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a   no-op..  **.  *
1b990 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
1b9a0 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
1b9b0 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
1b9c0 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
1b9d0 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
1b9e0 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
1b9f0 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
1ba00 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
1ba10 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
1ba20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
1ba30 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
1ba40 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
1ba50 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
1ba60 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
1ba70 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
1ba80 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
1ba90 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
1baa0 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
1bab0 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
1bac0 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
1bad0 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
1bae0 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
1baf0 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
1bb00 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
1bb10 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
1bb20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1bb30 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
1bb40 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
1bb50 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
1bb60 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1bb70 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
1bb80 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
1bb90 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
1bba0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
1bbb0 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
1bbc0 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
1bbd0 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
1bbe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bbf0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
1bc00 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
1bc10 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
1bc20 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
1bc30 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61  ayback..  */.  a
1bc40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1bc50 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1bc60 52 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70  RVED );.  rc = p
1bc70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
1bc80 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
1bc90 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a  IVE_LOCK);..  /*
1bca0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
1bcb0 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
1bcc0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
1bcd0 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
1bce0 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
1bcf0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
1bd00 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
1bd10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
1bd20 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
1bd30 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
1bd40 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1bd50 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
1bd60 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
1bd70 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
1bd80 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1bd90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1bda0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
1bdb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1bdc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
1bdd0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
1bde0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
1bdf0 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
1be00 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
1be10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
1be20 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
1be30 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
1be40 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
1be50 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
1be60 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
1be70 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
1be80 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
1be90 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
1bea0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
1beb0 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
1bec0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
1bed0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
1bee0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
1bef0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
1bf00 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
1bf10 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
1bf20 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
1bf30 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
1bf40 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
1bf50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
1bf60 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
1bf70 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
1bf80 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
1bf90 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
1bfa0 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
1bfb0 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
1bfc0 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
1bfd0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
1bfe0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
1bff0 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
1c000 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
1c010 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
1c020 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
1c030 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1c040 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
1c050 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
1c060 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
1c070 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c090 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1c0a0 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
1c0b0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
1c0c0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
1c0d0 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
1c0e0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
1c0f0 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
1c100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1c110 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  M, pData);..    
1c120 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
1c130 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
1c140 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c150 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1c160 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
1c170 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1c180 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
1c190 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
1c1a0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
1c1b0 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
1c1c0 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
1c1d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
1c1e0 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
1c1f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c200 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
1c210 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
1c220 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
1c230 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1c240 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
1c250 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
1c260 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
1c270 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
1c280 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1c290 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
1c2a0 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
1c2b0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1c2c0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1c2d0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
1c2e0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
1c2f0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c300 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
1c310 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
1c320 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
1c330 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
1c340 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
1c350 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
1c360 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
1c370 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
1c380 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1c390 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
1c3a0 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
1c3b0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1c3c0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
1c3d0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3f0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1c400 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
1c410 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
1c420 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
1c430 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
1c440 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1c450 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
1c460 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1c470 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
1c480 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1c490 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
1c4a0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
1c4b0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1c4c0 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
1c4d0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1c4e0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
1c4f0 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
1c500 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1c510 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
1c520 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1c530 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
1c540 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
1c550 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1c560 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1c570 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  c;.}../*.** Appe
1c580 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74  nd a record of t
1c590 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1c5a0 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20   of page pPg to 
1c5b0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
1c5c0 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63   .** It is the c
1c5d0 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
1c5e0 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62  ility to use sub
1c5f0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20  jRequiresPage() 
1c600 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61  to check .** tha
1c610 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  t it is really r
1c620 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63  equired before c
1c630 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1c640 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tion..**.** If s
1c650 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1c660 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
1c670 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e  ding to pPg->pgn
1c680 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73  o in the bitvecs
1c690 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e  .** for all open
1c6a0 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f   savepoints befo
1c6b0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
1c6c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c6d0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
1c6e0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
1c6f0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
1c700 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
1c710 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65  code if the atte
1c720 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
1c730 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1c740 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51  fails, or .** SQ
1c750 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
1c760 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69  malloc fails whi
1c770 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74  le setting a bit
1c780 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a   in a savepoint.
1c790 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74  ** bitvec..*/.st
1c7a0 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
1c7b0 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70  nalPage(PgHdr *p
1c7c0 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
1c7d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1c7e0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1c7f0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
1c800 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
1c810 6a 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  jfd) ){.    void
1c820 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
1c830 44 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66  Data;.    i64 of
1c840 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  fset = pPager->n
1c850 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
1c860 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c870 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
1c880 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
1c890 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1c8a0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
1c8b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
1c8c0 74 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54  ta2);.    PAGERT
1c8d0 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
1c8e0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1c8f0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1c900 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
1c910 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  .  .    assert( 
1c920 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
1c930 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
1c940 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1c950 7a 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  ze );.    rc = w
1c960 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
1c970 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
1c980 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c9a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1c9b0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1c9c0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
1c9d0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
1c9e0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
1c9f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1ca00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ca10 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1ca20 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
1ca30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1ca40 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
1ca50 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
1ca60 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
1ca70 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1ca80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ca90 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1caa0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1cab0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
1cac0 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
1cad0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
1cae0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
1caf0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
1cb00 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1cb10 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
1cb20 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
1cb30 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
1cb40 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
1cb50 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
1cb60 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
1cb70 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
1cb80 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
1cb90 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
1cba0 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
1cbb0 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
1cbc0 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
1cbd0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1cbe0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
1cbf0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
1cc00 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1cc10 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
1cc20 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
1cc30 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
1cc40 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
1cc50 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
1cc60 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
1cc70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
1cc80 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
1cc90 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
1cca0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
1ccb0 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
1ccc0 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
1ccd0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
1cce0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
1ccf0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
1cd00 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1cd10 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
1cd20 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
1cd30 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
1cd40 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1cd50 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1cd60 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
1cd70 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
1cd80 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
1cd90 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1cda0 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
1cdb0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
1cdc0 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
1cdd0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
1cde0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1cdf0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
1ce00 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
1ce10 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
1ce20 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
1ce30 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
1ce40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1ce50 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
1ce60 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
1ce70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1ce80 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
1ce90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cea0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
1ceb0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
1cec0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1ced0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1cee0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
1cef0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
1cf00 67 20 69 73 20 73 65 74 20 62 79 20 74 68 65 20  g is set by the 
1cf10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1cf20 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  e() function whi
1cf30 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f  le it.  ** is jo
1cf40 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20  urnalling a set 
1cf50 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64  of two or more d
1cf60 61 74 61 62 61 73 65 20 70 61 67 65 73 20 74 68  atabase pages th
1cf70 61 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  at are stored.  
1cf80 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64  ** on the same d
1cf90 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63  isk sector. Sync
1cfa0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
1cfb0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77  is not allowed w
1cfc0 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69  hile.  ** this i
1cfd0 73 20 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69  s happening as i
1cfe0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
1cff0 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  hat all members 
1d000 6f 66 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  of such a.  ** s
1d010 65 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20  et of pages are 
1d020 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74  synced to disk t
1d030 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20  ogether. So, if 
1d040 74 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75  the page this fu
1d050 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74  nction.  ** is t
1d060 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c  rying to make cl
1d070 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65  ean will require
1d080 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20   a journal sync 
1d090 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  and the doNotSyn
1d0a0 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73  c.  ** flag is s
1d0b0 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  et, return witho
1d0c0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
1d0d0 67 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c 61  g. The pcache la
1d0e0 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75  yer will.  ** ju
1d0f0 73 74 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68  st have to go ah
1d100 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ead and allocate
1d110 20 61 20 6e 65 77 20 70 61 67 65 20 62 75 66 66   a new page buff
1d120 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  er instead of.  
1d130 2a 2a 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a  ** reusing pPg..
1d140 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61    **.  ** Simila
1d150 72 6c 79 2c 20 69 66 20 74 68 65 20 70 61 67 65  rly, if the page
1d160 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
1d170 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
1d180 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20  state, do not.  
1d190 2a 2a 20 74 72 79 20 74 6f 20 77 72 69 74 65 20  ** try to write 
1d1a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d1b0 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a  pPg to disk..  *
1d1c0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
1d1d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a 20  ager->errCode). 
1d1e0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f    || (pPager->do
1d1f0 4e 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e  NotSync && pPg->
1d200 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1d210 5f 53 59 4e 43 29 0a 20 20 29 7b 0a 20 20 20 20  _SYNC).  ){.    
1d220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d230 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63  ;.  }..  /* Sync
1d240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d250 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
1d260 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  /.  if( pPg->fla
1d270 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1d280 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  NC ){.    rc = s
1d290 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
1d2a0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
1d2b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1d2c0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1d2d0 20 0a 20 20 20 20 20 20 21 28 70 50 61 67 65 72   .      !(pPager
1d2e0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1d2f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1d300 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20  _MEMORY) &&.    
1d310 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76    !(sqlite3OsDev
1d320 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1d330 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
1d340 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1d350 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b 0a  _APPEND).    ){.
1d360 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
1d370 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ec = 0;.      rc
1d380 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1d390 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
1d3a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1d3b0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1d3c0 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c  f this page is l
1d3d0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63  arger than the c
1d3e0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20  urrent size of. 
1d3f0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1d400 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e   image, it may n
1d410 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65  eed to be writte
1d420 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
1d430 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73 20  rnal..  ** This 
1d440 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  is because the c
1d450 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69  all to pager_wri
1d460 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65  te_pagelist() be
1d470 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  low will not.  *
1d480 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65  * actually write
1d490 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
1d4a0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
1d4b0 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69 64    **.  ** Consid
1d4c0 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
1d4d0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
1d4e0 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nts:.  **.  **  
1d4f0 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20   BEGIN;.  **    
1d500 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
1d510 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69  >.  **     <modi
1d520 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20  fy page X>.  ** 
1d530 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
1d540 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68  ;.  **       <sh
1d550 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69  rink database fi
1d560 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20  le to Y pages>. 
1d570 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53   **       pagerS
1d580 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20  tress(page X).  
1d590 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
1d5a0 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  TO sp;.  **.  **
1d5b0 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20   If (X>Y), then 
1d5c0 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73  when pagerStress
1d5d0 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20   is called page 
1d5e0 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  X will not be wr
1d5f0 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20 74  itten.  ** out t
1d600 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d610 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65  ile, but will be
1d620 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68   dropped from th
1d630 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20  e cache. Then,. 
1d640 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
1d650 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
1d660 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65  p" statement, re
1d670 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c  ading page X wil
1d680 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74 61  l read.  ** data
1d690 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1d6a0 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69  se file. This wi
1d6b0 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  ll be the copy o
1d6c0 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20  f page X as it. 
1d6d0 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65   ** was when the
1d6e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1d6f0 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20  rted, not as it 
1d700 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f  was when "SAVEPO
1d710 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61 73  INT sp".  ** was
1d720 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 0a   executed..  **.
1d730 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
1d740 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68  n is to write th
1d750 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66  e current data f
1d760 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74  or page X into t
1d770 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75  he .  ** sub-jou
1d780 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69  rnal file now (i
1d790 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1d7a0 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74  ady there), so t
1d7b0 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a 2a  hat it will.  **
1d7c0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1d7d0 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
1d7e0 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  e when the "ROLL
1d7f0 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a  BACK TO sp" is .
1d800 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20    ** executed.. 
1d810 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
1d820 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  .      rc==SQLIT
1d830 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e  E_OK && pPg->pgn
1d840 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
1d850 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
1d860 50 61 67 65 28 70 50 67 29 0a 20 20 29 20 29 7b  Page(pPg).  ) ){
1d870 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
1d880 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
1d890 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
1d8a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1d8b0 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
1d8c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d8d0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
1d8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d8f0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
1d900 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d910 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1d920 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Pg);.  }..  /* M
1d930 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1d940 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
1d950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d960 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
1d970 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
1d980 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1d990 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1d9a0 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
1d9b0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1d9c0 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
1d9d0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1d9e0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1d9f0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1da00 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
1da10 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
1da20 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
1da30 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
1da40 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
1da50 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
1da60 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
1da70 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
1da80 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1da90 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
1daa0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1dab0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
1dac0 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
1dad0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
1dae0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
1daf0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
1db00 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
1db10 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
1db20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
1db30 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
1db40 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
1db50 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
1db60 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
1db70 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
1db80 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
1db90 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
1dba0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
1dbb0 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
1dbc0 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
1dbd0 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
1dbe0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
1dbf0 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
1dc00 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
1dc10 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
1dc20 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
1dc30 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
1dc40 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
1dc50 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
1dc60 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
1dc70 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
1dc80 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
1dc90 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
1dca0 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
1dcb0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
1dcc0 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
1dcd0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
1dce0 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
1dcf0 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
1dd00 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
1dd10 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
1dd20 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
1dd30 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
1dd40 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
1dd50 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
1dd60 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
1dd70 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
1dd80 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f  he PAGER_OMIT_JO
1dd90 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f  URNAL and PAGER_
1dda0 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67  NO_READLOCK flag
1ddb0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
1ddc0 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
1ddd0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
1dde0 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
1ddf0 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
1de00 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
1de10 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
1de20 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
1de30 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
1de40 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1de50 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
1de60 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
1de70 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
1de80 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
1de90 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
1dea0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1deb0 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
1dec0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
1ded0 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
1dee0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1def0 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
1df00 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
1df10 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
1df20 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
1df30 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
1df40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
1df50 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
1df60 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
1df70 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
1df80 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1df90 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
1dfa0 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
1dfb0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
1dfc0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
1dfd0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1dfe0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
1dff0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
1e000 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
1e010 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
1e020 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1e030 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
1e040 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
1e050 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e060 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
1e070 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1e080 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
1e090 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
1e0a0 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
1e0b0 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
1e0c0 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
1e0d0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
1e0e0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e100 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
1e110 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
1e120 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
1e130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
1e140 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
1e150 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
1e160 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
1e170 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
1e180 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
1e190 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
1e1a0 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
1e1b0 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
1e1c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
1e1d0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1e1e0 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
1e1f0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
1e200 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e210 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
1e220 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1e230 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
1e240 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e250 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
1e260 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
1e270 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
1e280 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
1e290 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e2a0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1e2b0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
1e2c0 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
1e2d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e2e0 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
1e2f0 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
1e300 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
1e310 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
1e320 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
1e330 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
1e340 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
1e350 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
1e360 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
1e370 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1e380 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
1e390 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1e3a0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1e3b0 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
1e3c0 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
1e3d0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1e3e0 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
1e3f0 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
1e400 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
1e410 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
1e420 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1e430 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
1e440 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f  0;  /* True to o
1e450 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  mit read-lock */
1e460 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
1e470 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
1e480 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
1e490 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
1e4a0 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
1e4b0 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44 66  /.  u16 szPageDf
1e4c0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
1e4d0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
1e4e0 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
1e4f0 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  size */..  /* Fi
1e500 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
1e510 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
1e520 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
1e530 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
1e540 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
1e550 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
1e560 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
1e570 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
1e580 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
1e590 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
1e5a0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
1e5b0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
1e5c0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1e5d0 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
1e5e0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
1e5f0 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
1e600 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
1e610 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
1e620 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
1e630 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
1e640 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
1e650 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
1e660 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
1e670 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
1e680 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
1e690 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
1e6a0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
1e6b0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
1e6c0 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
1e6d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
1e6e0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
1e6f0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
1e700 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
1e710 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
1e720 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
1e730 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
1e740 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e750 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1e760 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
1e770 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
1e780 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
1e790 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
1e7a0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
1e7b0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
1e7c0 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
1e7d0 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
1e7e0 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
1e7f0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1e800 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
1e810 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
1e820 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
1e830 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
1e840 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
1e850 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
1e860 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
1e870 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
1e880 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
1e890 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
1e8a0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
1e8b0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
1e8c0 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61  ] ){.    nPathna
1e8d0 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
1e8e0 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
1e8f0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
1e900 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
1e910 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
1e920 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
1e930 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e940 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69  _NOMEM;.    }.#i
1e950 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e960 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
1e970 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
1e980 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
1e990 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
1e9a0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
1e9b0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
1e9c0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1e9d0 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74      {.      zPat
1e9e0 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
1e9f0 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
1ea00 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
1ea10 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
1ea20 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ils */.      rc 
1ea30 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
1ea40 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
1ea50 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
1ea60 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
1ea70 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68      }..    nPath
1ea80 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
1ea90 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
1eaa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1eab0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
1eac0 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
1ead0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
1eae0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
1eaf0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
1eb00 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
1eb10 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
1eb20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1eb30 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
1eb40 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
1eb50 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1eb60 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
1eb70 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
1eb80 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1eb90 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
1eba0 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
1ebb0 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
1ebc0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
1ebd0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1ebe0 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
1ebf0 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
1ec00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
1ec10 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
1ec20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
1ec30 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1ec40 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1ec50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ec60 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1ec70 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
1ec80 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1ec90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
1eca0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
1ecb0 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
1ecc0 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
1ecd0 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
1ece0 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
1ecf0 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
1ed00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ed10 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
1ed20 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
1ed30 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
1ed40 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
1ed50 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
1ed60 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
1ed70 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
1ed80 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
1ed90 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
1eda0 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
1edb0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
1edc0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
1edd0 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
1ede0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
1edf0 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
1ee10 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
1ee20 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
1ee30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1ee40 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
1ee50 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
1ee60 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
1ee70 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
1ee80 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
1ee90 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
1eea0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
1eeb0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
1eed0 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
1eee0 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
1eef0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
1ef00 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
1ef10 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
1ef20 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
1ef30 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
1ef40 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
1ef50 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
1ef60 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
1ef70 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
1ef80 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
1ef90 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
1efa0 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
1efb0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
1efc0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
1efd0 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
1efe0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
1eff0 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
1f000 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
1f010 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
1f020 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
1f030 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
1f040 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20  + 1 +           
1f050 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
1f060 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
1f070 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20  me + 8 + 1      
1f080 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
1f090 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73  nal */.  );.  as
1f0a0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1f0b0 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
1f0c0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
1f0d0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
1f0e0 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
1f0f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1f100 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
1f110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f120 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
1f130 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
1f140 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
1f150 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
1f160 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
1f170 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
1f180 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
1f190 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
1f1a0 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
1f1b0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
1f1c0 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
1f1d0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
1f1e0 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
1f1f0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
1f200 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
1f210 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
1f220 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
1f230 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
1f240 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
1f250 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
1f260 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
1f270 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
1f280 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
1f290 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1f2a0 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
1f2b0 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
1f2c0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
1f2d0 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
1f2e0 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
1f2f0 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
1f300 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
1f310 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
1f320 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1f330 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
1f340 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
1f350 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   1);.    memcpy(
1f360 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f370 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
1f380 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1f390 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
1f3a0 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
1f3b0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
1f3c0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1f3d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
1f3e0 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
1f3f0 22 2c 20 38 29 3b 0a 20 20 20 20 69 66 28 20 70  ", 8);.    if( p
1f400 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f410 5b 30 5d 3d 3d 30 20 29 20 70 50 61 67 65 72 2d  [0]==0 ) pPager-
1f420 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30  >zJournal[0] = 0
1f430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1f440 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
1f450 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66   }.  pPager->pVf
1f460 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67  s = pVfs;.  pPag
1f470 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
1f480 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f  fsFlags;..  /* O
1f490 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
1f4a0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
1f4b0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
1f4c0 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d  ename[0] && !mem
1f4d0 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f  Db ){.    int fo
1f4e0 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
1f4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
1f500 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  S flags returned
1f510 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   by xOpen() */. 
1f520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f530 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
1f540 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
1f550 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c  Pager->fd, vfsFl
1f560 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
1f570 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
1f580 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
1f590 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a  ADONLY);..    /*
1f5a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
1f5b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
1f5c0 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
1f5d0 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
1f5e0 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
1f5f0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
1f600 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
1f610 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
1f620 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1f630 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
1f640 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
1f650 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a  aximum of:.    *
1f660 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51  *.    **    + SQ
1f670 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1f680 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20  E_SIZE,.    **  
1f690 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
1f6a0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1f6b0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
1f6c0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
1f6d0 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a  largest page siz
1f6e0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72  e that can be wr
1f6f0 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
1f700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f720 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
1f730 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
1f740 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
1f750 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1f760 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1f770 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  E<=SQLITE_MAX_DE
1f780 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
1f790 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50 61  ;.      if( szPa
1f7a0 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73  geDflt<pPager->s
1f7b0 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
1f7c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1f7d0 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
1f7e0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f7f0 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
1f800 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
1f810 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
1f820 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
1f830 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f840 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
1f850 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61 67  Dflt = (u16)pPag
1f860 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
1f870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f880 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1f890 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
1f8a0 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ITE.      {.    
1f8b0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
1f8c0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1f8d0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1f8e0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
1f8f0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
1f900 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1f910 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
1f920 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
1f930 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
1f940 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
1f950 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
1f960 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
1f970 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f980 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
1f990 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  36);.        for
1f9a0 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
1f9b0 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
1f9c0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1f9d0 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
1f9e0 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
1f9f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1fa00 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
1fa10 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
1fa20 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20  eDflt = ii;.    
1fa30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fa40 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
1fa50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1fa60 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70      /* If a temp
1fa70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65  orary file is re
1fa80 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e  quested, it is n
1fa90 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69  ot opened immedi
1faa0 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e  ately..    ** In
1fab0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63   this case we ac
1fac0 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74  cept the default
1fad0 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64   page size and d
1fae0 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20  elay actually.  
1faf0 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65    ** opening the
1fb00 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
1fb10 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73  first call to Os
1fb20 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Write()..    **.
1fb30 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
1fb40 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66  ch is also run f
1fb50 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
1fb60 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d  database. An in-
1fb70 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61  memory.    ** da
1fb80 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61  tabase is the sa
1fb90 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c  me as a temp-fil
1fba0 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20  e that is never 
1fbb0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20  written out to. 
1fbc0 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75     ** disk and u
1fbd0 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ses an in-memory
1fbe0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1fbf0 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74  l..    */ .    t
1fc00 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
1fc10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1fc20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1fc30 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
1fc40 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
1fc50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
1fc60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1fc70 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
1fc80 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
1fc90 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
1fca0 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1fcb0 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
1fcc0 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
1fcd0 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
1fce0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
1fcf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1fd00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fd10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fd20 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
1fd30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fd40 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
1fd50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
1fd60 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
1fd70 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1fd80 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
1fd90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1fda0 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  urred in either 
1fdb0 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
1fdc0 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20  ove, free the . 
1fdd0 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   ** Pager struct
1fde0 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
1fdf0 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
1fe00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fe10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1fe20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
1fe30 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ce );.    sqlite
1fe40 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
1fe50 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
1fe60 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
1fe70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1fe80 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
1fe90 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
1fea0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65  bject. */.  asse
1feb0 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
1fec0 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f  );.  nExtra = RO
1fed0 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20  UND8(nExtra);.  
1fee0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
1fef0 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
1ff00 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
1ff30 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
1ff40 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1ff50 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47  pPCache);..  PAG
1ff60 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
1ff70 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
1ff80 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
1ff90 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
1ffa0 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
1ffb0 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
1ffc0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
1ffd0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
1ffe0 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
1fff0 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
20000 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
20010 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e  >noReadlock = (n
20020 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
20030 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f  dOnly) ?1:0;.  /
20040 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
20050 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
20060 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
20070 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
20080 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
20090 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
200a0 53 69 7a 65 56 61 6c 69 64 20 3d 20 28 75 38 29  SizeValid = (u8)
200b0 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67  memDb;.  /* pPag
200c0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
200d0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
200e0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
200f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20100 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
20110 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
20120 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
20130 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
20140 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
20150 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
20160 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20170 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
20180 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
20190 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
201a0 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50  LOCK) );.  /* pP
201b0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
201c0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
201d0 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74  tempFile = (u8)t
201e0 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
201f0 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
20200 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
20210 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
20220 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
20230 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
20240 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
20250 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
20260 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
20270 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
20280 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
20290 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
202a0 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   .  pPager->chan
202b0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
202c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
202d0 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
202e0 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
202f0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
20300 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a  = (u8)readOnly;.
20310 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65    /* pPager->nee
20320 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20  dSync = 0; */.  
20330 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e  assert( useJourn
20340 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  al || pPager->te
20350 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67  mpFile );.  pPag
20360 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
20370 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
20380 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
20390 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  c = pPager->noSy
203a0 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65  nc ?0:1;.  pPage
203b0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
203c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
203d0 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
203e0 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
203f0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
20400 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
20410 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
20420 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
20430 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
20440 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70  (u16)nExtra;.  p
20450 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
20460 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
20470 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
20480 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
20490 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
204a0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
204b0 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
204c0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
204d0 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72  ;.  if( !useJour
204e0 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  nal ){.    pPage
204f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
20500 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20510 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20  DE_OFF;.  }else 
20520 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
20530 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20540 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
20550 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
20560 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
20570 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
20580 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20590 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
205a0 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Arg = 0; */.  pP
205b0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
205c0 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20  = xReinit;.  /* 
205d0 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
205e0 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
205f0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
20600 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
20610 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
20620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20630 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
20640 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20650 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
20660 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
20670 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
20680 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
20690 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
206a0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
206b0 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
206c0 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
206d0 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
206e0 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
206f0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
20700 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
20710 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
20720 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
20730 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
20740 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
20750 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
20760 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
20770 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
20780 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
20790 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
207a0 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
207b0 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
207c0 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
207d0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
207e0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
207f0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
20800 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
20810 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
20820 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
20830 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
20840 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
20850 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
20860 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20870 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
20880 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
20890 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
208a0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
208b0 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
208c0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
208d0 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
208e0 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
208f0 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
20900 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
20910 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
20920 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
20930 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
20940 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
20950 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
20960 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
20970 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
20980 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
20990 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
209a0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
209b0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
209c0 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
209d0 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
209e0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
209f0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
20a00 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
20a10 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
20a20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20a30 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
20a40 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
20a50 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
20a60 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
20a70 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
20a80 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
20a90 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
20aa0 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
20ab0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
20ac0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
20ad0 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
20ae0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
20af0 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
20b00 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
20b10 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
20b20 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
20b30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
20b40 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
20b50 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
20b60 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
20b70 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
20b80 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
20b90 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
20ba0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
20bb0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
20bc0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
20bd0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
20be0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
20bf0 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
20c00 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
20c10 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
20c20 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
20c30 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
20c40 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
20c50 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
20c60 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
20c70 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
20c80 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
20c90 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
20ca0 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
20cb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
20cc0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
20cd0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
20ce0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d00 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
20d10 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20 20   int exists;    
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d30 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
20d40 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
20d50 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
20d60 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
20d70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20d80 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
20d90 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
20da0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
20db0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
20dc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
20dd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20de0 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45  r->state <= PAGE
20df0 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2a  R_SHARED );..  *
20e00 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72  pExists = 0;.  r
20e10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
20e20 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
20e30 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
20e40 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
20e50 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66  , &exists);.  if
20e60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20e70 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
20e80 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20   int locked;    
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ea0 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
20eb0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
20ec0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
20ed0 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
20ee0 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
20ef0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
20f00 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
20f10 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
20f20 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
20f30 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
20f40 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
20f50 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
20f60 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
20f70 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
20f80 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
20f90 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
20fa0 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
20fb0 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
20fc0 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
20fd0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
20fe0 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
20ff0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
21000 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
21010 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
21020 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
21030 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
21040 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
21050 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
21060 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
21070 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
21080 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
21090 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
210a0 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
210b0 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
210c0 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
210d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
210e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
210f0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
21100 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
21110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21120 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
21130 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
21140 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65      /* Check the
21150 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
21160 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
21170 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  t consists of 0 
21180 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20  pages,.      ** 
21190 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
211a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65  journal file. Se
211b0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
211c0 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a  ment above for .
211d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61        ** the rea
211e0 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65  soning here.  De
211f0 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74  lete the obsolet
21200 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75  e journal file u
21210 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20  nder.      ** a 
21220 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
21230 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64   avoid race cond
21240 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76  itions and to av
21250 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20  oid violating.  
21260 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e      ** [H33020].
21270 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21280 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21290 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
212a0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
212b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
212c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
212d0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
212e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
212f0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
21300 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
21310 66 28 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  f( sqlite3OsLock
21320 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
21330 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
21340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21350 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
21360 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
21370 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
21380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21390 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
213a0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
213b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
213c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
213d0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
213e0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
213f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21400 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
21410 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
21420 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
21430 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
21440 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
21450 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
21460 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21470 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
21480 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
21490 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
214a0 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
214b0 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
214c0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
214d0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
214e0 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
214f0 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
21500 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
21510 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
21520 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
21530 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
21540 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
21550 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
21560 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
21570 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
21580 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
21590 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  L;.          rc 
215a0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
215b0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
215c0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
215d0 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20  jfd, f, &f);.   
215e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
215f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21600 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74          u8 first
21610 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21630 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
21640 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74  , (void *)&first
21650 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
21660 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21670 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
21680 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
21690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
216a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
216b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
216c0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
216d0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
216e0 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
216f0 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a  s = (first!=0);.
21700 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
21710 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
21720 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
21730 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
21740 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  cannot open the 
21750 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
21760 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
21770 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20  o see if.       
21780 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20       ** its has 
21790 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74  a zero header, t
217a0 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65  hat might be due
217b0 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   to an I/O error
217c0 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  , or.           
217d0 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
217e0 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20  due to the race 
217f0 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
21800 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e  bed above and in
21810 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21820 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45  ticket #3883.  E
21830 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d  ither way, assum
21840 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
21850 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20  al is hot..     
21860 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d         ** This m
21870 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20  ight be a false 
21880 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69  positive.  But i
21890 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
218a0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
218b0 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e   automatic journ
218c0 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20  al playback and 
218d0 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69  recovery mechani
218e0 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20  sm will deal.   
218f0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68           ** with
21900 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43   it under an EXC
21910 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72  LUSIVE lock wher
21920 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
21930 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
21940 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68  ** worry so much
21950 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69   with race condi
21960 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  tions..         
21970 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
21980 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
21990 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
219a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
219b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
219c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
219d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
219e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
219f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
21a00 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
21a10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21a20 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
21a30 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
21a40 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
21a50 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
21a60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21a70 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
21a80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
21a90 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
21aa0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
21ab0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
21ac0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
21ad0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
21ae0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
21af0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
21b00 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
21b10 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
21b20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
21b30 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
21b40 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
21b50 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
21b60 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
21b70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
21b80 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
21b90 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
21ba0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
21bb0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
21bc0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
21bd0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
21be0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
21bf0 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
21c00 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
21c10 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
21c20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
21c50 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 73  e */.  i64 iOffs
21c60 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
21c70 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
21c80 65 74 20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65  et of file to re
21c90 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73  ad from */..  as
21ca0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21cb0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
21cc0 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  D && !MEMDB );. 
21cd0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
21ce0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
21cf0 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f    if( NEVER(!isO
21d00 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29  pen(pPager->fd))
21d10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21d20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
21d30 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
21d40 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
21d50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
21d60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21d70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66  TE_OK;.  }.  iOf
21d80 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
21d90 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
21da0 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  eSize;.  rc = sq
21db0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
21dc0 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
21dd0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
21de0 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a  Size, iOffset);.
21df0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21e00 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
21e10 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  D ){.    rc = SQ
21e20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
21e30 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
21e40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21e50 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64    /* If the read
21e60 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c   is unsuccessful
21e70 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65  , set the dbFile
21e80 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68  Vers[] to someth
21e90 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ing.      ** tha
21ea0 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  t will never be 
21eb0 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72  a valid file ver
21ec0 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72  sion.  dbFileVer
21ed0 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20  s[] is a copy.  
21ee0 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20      ** of bytes 
21ef0 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
21f00 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32  tabase.  Bytes 2
21f10 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77  8..31 should alw
21f20 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ays be.      ** 
21f30 7a 65 72 6f 2e 20 20 42 79 74 65 73 20 33 32 2e  zero.  Bytes 32.
21f40 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 20 73  .35 and 35..39 s
21f50 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
21f60 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 0a  mbers which are.
21f70 20 20 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 30        ** never 0
21f80 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
21f90 69 6c 6c 69 6e 67 20 70 50 61 67 65 72 2d 3e 64  illing pPager->d
21fa0 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
21fb0 20 61 6c 6c 20 30 78 66 66 0a 20 20 20 20 20 20   all 0xff.      
21fc0 2a 2a 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ** bytes should 
21fd0 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
21fe0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
21ff0 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
22000 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
22010 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
22020 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
22030 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
22040 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
22050 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
22060 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
22070 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
22080 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
22090 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
220a0 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
220b0 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
220c0 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
220d0 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
220e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
220f0 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
22100 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
22110 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
22120 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
22130 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
22140 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
22150 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
22160 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
22170 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
22180 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
22190 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
221a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
221b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
221c0 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
221d0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
221e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
221f0 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
22200 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
22210 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
22220 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
22230 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
22240 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
22250 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
22260 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
22270 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
22280 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
22290 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
222a0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
222b0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
222c0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
222d0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
222e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
222f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22300 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  d to obtain a sh
22310 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
22320 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
22330 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
22340 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
22350 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75  PagerAcquire() u
22360 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
22370 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
22380 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
22390 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
223a0 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
223b0 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
223c0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
223d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
223e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
223f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
22400 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
22410 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
22420 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
22430 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
22440 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
22450 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c  tly in PAGER_UNL
22460 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  OCK state (no lo
22470 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
22480 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22490 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
224a0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
224b0 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
224c0 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
224d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
224e0 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
224f0 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
22500 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
22510 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
22520 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
22530 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
22540 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
22550 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
22560 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
22570 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
22580 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
22590 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
225a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
225b0 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
225c0 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
225d0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
225e0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
225f0 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
22600 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
22610 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
22620 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
22630 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
22640 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
22650 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
22660 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
22670 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
22680 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
22690 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
226a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
226b0 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
226c0 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
226d0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
226e0 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
226f0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
22700 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
22710 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
22720 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
22730 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
22740 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
22750 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
22760 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
22770 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
22780 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72  *.** If the oper
22790 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
227a0 62 79 20 28 32 29 20 61 62 6f 76 65 20 69 73 20  by (2) above is 
227b0 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61  not attempted, a
227c0 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd if the.** pag
227d0 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
227e0 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
227f0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77  an SQLITE_FULL w
22800 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
22810 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
22820 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
22830 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
22840 74 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74  t is permitted t
22850 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61  o read the.** da
22860 74 61 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53  tabase when in S
22870 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72  QLITE_FULL error
22880 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74   state..**.** Ot
22890 68 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72  herwise, if ever
228a0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
228b0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
228c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
228d0 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f  an.** IO error o
228e0 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b  ccurs while lock
228f0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
22900 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  , checking for a
22910 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
22920 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  file or rolling 
22930 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
22940 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ile, the IO erro
22950 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
22960 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
22970 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
22980 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
22990 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
229a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
229b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
229c0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
229d0 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b  sErrorReset = 0;
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
229f0 20 54 72 75 65 20 69 66 20 72 65 63 6f 76 65 72   True if recover
22a00 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f 72 20 73  ing from error s
22a10 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  tate */..  /* Th
22a20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
22a30 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
22a40 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
22a50 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
22a60 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
22a70 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 61 73 73  g pages */.  ass
22a80 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
22a90 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22aa0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
22ab0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
22ac0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
22ad0 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
22ae0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
22af0 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e; }..  /* If th
22b00 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 69  is database is i
22b10 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  n an error-state
22b20 2c 20 6e 6f 77 20 69 73 20 61 20 63 68 61 6e 63  , now is a chanc
22b30 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20  e to clear.  ** 
22b40 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61  the error. Disca
22b50 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
22b60 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
22b70 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a  he and rollback.
22b80 20 20 2a 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75    ** any hot jou
22b90 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
22ba0 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20  -system..  */.  
22bb0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
22bc0 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ode ){.    if( i
22bd0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
22be0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a  d) || pPager->zJ
22bf0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
22c00 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31  isErrorReset = 1
22c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
22c20 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
22c30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67  LITE_OK;.    pag
22c40 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
22c50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
22c60 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
22c70 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72  R_UNLOCK || isEr
22c80 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
22c90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
22ca0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
22cb0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  r->pVfs;.    int
22cc0 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20   isHotJournal = 
22cd0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
22ce0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
22cf0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
22d00 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22d10 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
22d20 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
22d30 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
22d40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
22d50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
22d60 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
22d70 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
22d80 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ARED;.    }else{
22d90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22da0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
22db0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
22dc0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
22dd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22de0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22df0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
22e00 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
22e10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
22e20 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
22e30 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
22e40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22e50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
22e60 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
22e70 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
22e80 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
22e90 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
22ea0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
22eb0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
22ec0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
22ed0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
22ee0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
22ef0 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
22f00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69     */.    if( !i
22f10 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
22f20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
22f30 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41  ger->state <= PA
22f40 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
22f50 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
22f60 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
22f70 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  isHotJournal);. 
22f80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22fa0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
22fb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22fc0 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73 65   if( isErrorRese
22fd0 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61  t || isHotJourna
22fe0 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
22ff0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
23000 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
23010 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
23020 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
23030 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
23040 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
23050 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
23060 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
23070 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
23080 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
23090 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
230a0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
230b0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
230c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
230d0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
230e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
230f0 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
23100 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
23110 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
23120 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
23130 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
23140 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
23150 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
23160 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
23170 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
23180 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
23190 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
231a0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
231b0 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
231c0 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
231d0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
231e0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
231f0 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
23200 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
23210 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
23220 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
23230 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
23240 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
23250 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
23260 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
23270 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
23280 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
23290 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
232a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
232b0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
232c0 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
232d0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
232e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
232f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23300 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
23310 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
23320 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
23330 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
23340 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
23350 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
23360 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 7d  CLUSIVE;.      }
23370 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  . .      /* Open
23380 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
23390 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
233a0 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
233b0 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  use in .      **
233c0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
233d0 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
233e0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
233f0 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  be kept open and
23400 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  .      ** possib
23410 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
23420 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
23430 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  on. On some syst
23440 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ems, the.      *
23450 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63  * OsTruncate() c
23460 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c  all used in excl
23470 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
23480 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a  e also requires.
23490 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
234a0 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
234b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
234c0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
234d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
234e0 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
234f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23500 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
23510 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  ,pPager->zJourna
23520 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  l,SQLITE_ACCESS_
23530 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20  EXISTS,&res);.  
23540 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
23550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23560 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a       if( res ){.
23570 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
23580 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
23590 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
235a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
235b0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
235c0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
235d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
235e0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
235f0 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
23600 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23610 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
23620 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
23630 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
23640 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
23650 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
23660 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
23670 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
23680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
236a0 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
236b0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
236d0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
236e0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
236f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
23700 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
23710 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
23720 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
23730 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
23740 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
23750 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
23760 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e   it usually mean
23770 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20  s that some .   
23780 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65           ** othe
23790 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e  r connection man
237a0 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61  aged to get in a
237b0 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  nd roll it back 
237c0 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 20 20  before .        
237d0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e      ** this conn
237e0 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20  ection obtained 
237f0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
23800 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74  ck above. Or, it
23810 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
23820 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
23830 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
23840 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
23850 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
23860 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
23870 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64  n was called and
23880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
23890 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
238a0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
238b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
238c0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
238d0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ger, 0);.       
238e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
238f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23910 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
23920 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
23930 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 57        /* TODO: W
23940 68 79 20 61 72 65 20 74 68 65 73 65 20 63 6c 65  hy are these cle
23950 61 72 65 64 20 68 65 72 65 3f 20 49 73 20 69 74  ared here? Is it
23960 20 6e 65 63 65 73 73 61 72 79 3f 20 2a 2f 0a 20   necessary? */. 
23970 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
23980 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
23990 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
239a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
239b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
239c0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
239d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
239e0 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
239f0 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
23a00 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
23a10 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
23a20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
23a30 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
23a40 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
23a50 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20  ead lock. Purge 
23a60 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65  the cache before
23a70 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e  .      ** playin
23a80 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a  g back the hot-j
23a90 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77  ournal so that w
23aa0 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77  e don't end up w
23ab0 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ith.      ** an 
23ac0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
23ad0 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  he..      */.   
23ae0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
23af0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
23b00 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
23b10 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
23b20 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
23b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23b40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
23b50 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
23b60 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
23b70 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
23b80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23b90 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
23ba0 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
23bb0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  ==PAGER_SHARED).
23bc0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
23bd0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
23be0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
23bf0 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
23c00 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ED).      );.   
23c10 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67   }..    if( pPag
23c20 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73  er->pBackup || s
23c30 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
23c40 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
23c50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
23c60 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
23c70 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
23c80 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
23c90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23ca0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
23cb0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
23cc0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
23cd0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
23ce0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
23cf0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
23d00 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
23d10 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
23d20 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
23d30 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
23d40 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
23d50 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
23d60 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
23d70 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
23d80 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
23d90 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
23da0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
23db0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
23dc0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
23dd0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
23de0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
23df0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
23e00 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
23e10 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
23e20 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
23e30 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
23e40 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
23e50 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
23e60 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
23e70 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
23e80 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
23e90 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
23ea0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
23eb0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
23ec0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
23ed0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
23ee0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
23ef0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
23f00 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
23f10 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
23f20 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
23f30 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
23f40 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
23f50 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
23f60 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
23f70 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
23f80 50 61 67 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Page;.      char
23f90 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
23fa0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
23fb0 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73  eVers)];.      s
23fc0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
23fd0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
23fe0 61 67 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  age);..      if(
23ff0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
24000 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24010 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
24020 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
24030 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
24040 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e        if( nPage>
24050 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54  0 ){.        IOT
24060 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
24070 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
24080 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
24090 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  s)));.        rc
240a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
240b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
240c0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
240d0 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
240e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
240f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24100 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
24110 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
24120 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24130 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
24140 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
24150 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
24160 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
24170 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
24180 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
24190 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
241a0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
241b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  0 ){.        pag
241c0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
241d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
241e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
241f0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
24200 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  e || pPager->sta
24210 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
24220 20 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64   );.  }.. failed
24230 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
24240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
24250 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
24260 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78  s a no-op for ex
24270 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
24280 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
24290 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67  ases. */.    pag
242a0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
242b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
242c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
242d0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
242e0 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
242f0 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61  zero, rollback a
24300 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  ny active.** tra
24310 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c  nsaction and unl
24320 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  ock the pager..*
24330 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20  *.** Except, in 
24340 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
24350 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72  LUSIVE when ther
24360 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
24370 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  in.** the rollba
24380 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20  ck journal, the 
24390 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65  unlock is not pe
243a0 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72  rformed and ther
243b0 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  e is.** nothing 
243c0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20  to rollback, so 
243d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
243e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61  a no-op..*/ .sta
243f0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
24400 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67  lockIfUnused(Pag
24410 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
24420 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68  f( (sqlite3Pcach
24430 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
24440 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20  ->pPCache)==0). 
24450 20 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65    && (!pPager->e
24460 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
24470 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
24480 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  ff>0) .  ){.    
24490 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
244a0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
244b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71    }.}../*.** Acq
244c0 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
244d0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
244e0 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
244f0 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
24500 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
24510 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
24520 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
24530 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
24540 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
24550 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
24560 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
24570 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
24580 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
24590 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
245a0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
245b0 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
245c0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
245d0 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
245e0 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
245f0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
24600 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
24610 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
24620 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24630 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
24640 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
24650 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
24660 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
24670 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
24680 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
24690 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
246a0 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
246b0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
246c0 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
246d0 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
246e0 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
246f0 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
24700 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
24710 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
24720 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
24730 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
24740 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
24750 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
24760 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
24770 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
24780 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
24790 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
247a0 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
247b0 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
247c0 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
247d0 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
247e0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
247f0 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
24800 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
24810 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
24820 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76  a .** non-zero v
24830 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61  alue is passed a
24840 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  s the noContent 
24850 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68  parameter and th
24860 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
24870 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
24880 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
24890 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
248a0 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
248b0 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
248c0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
248d0 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
248e0 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
248f0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
24900 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
24910 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
24920 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
24930 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
24940 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
24950 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
24960 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
24970 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74  s in two seperat
24980 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  e scenarios:.**.
24990 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61  **   a) When rea
249a0 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74  ding a free-list
249b0 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
249c0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
249d0 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65  d.**.**   b) Whe
249e0 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
249f0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
24a00 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  ck and we need t
24a10 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61  o load.**      a
24a20 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74   new page into t
24a30 68 65 20 63 61 63 68 65 20 74 6f 20 70 6f 70 75  he cache to popu
24a40 6c 61 74 65 20 77 69 74 68 20 74 68 65 20 64 61  late with the da
24a50 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
24a60 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
24a70 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
24a80 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
24a90 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
24aa0 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
24ab0 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
24ac0 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
24ad0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
24ae0 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
24af0 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
24b00 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
24b10 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
24b20 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
24b30 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
24b40 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
24b50 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
24b60 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
24b70 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
24b80 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
24b90 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
24ba0 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
24bb0 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
24bc0 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
24bd0 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
24be0 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
24bf0 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
24c00 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
24c10 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
24c20 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
24c30 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
24c40 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
24c50 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
24c60 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
24c70 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
24c80 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
24c90 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
24ca0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
24cb0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
24cc0 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
24cd0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
24ce0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
24cf0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
24d00 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
24d10 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
24d20 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
24d30 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
24d40 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
24d50 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
24d60 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
24d70 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
24d80 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
24d90 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
24da0 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
24db0 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
24dc0 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
24dd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
24de0 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
24df0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
24e00 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
24e10 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
24e20 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
24e30 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
24e40 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
24e50 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
24e60 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
24e70 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
24e80 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
24e90 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
24ea0 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
24eb0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
24ec0 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
24ed0 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
24ee0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
24ef0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24f00 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
24f10 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
24f20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
24f30 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
24f40 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
24f50 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
24f60 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
24f70 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
24f80 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
24f90 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
24fa0 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
24fb0 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
24fc0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
24fd0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
24fe0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
24ff0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
25000 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
25010 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47  Pager->state>PAG
25020 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
25030 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
25040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25050 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25060 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
25070 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
25080 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
25090 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
250a0 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
250b0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
250c0 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
250d0 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
250e0 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
250f0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
25100 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
25110 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
25120 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  E_FULL ){.    rc
25130 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
25140 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
25150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
25160 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
25170 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
25180 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a  1, ppPage);.  }.
25190 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
251a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
251b0 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
251c0 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
251d0 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
251e0 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
251f0 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
25200 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
25210 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
25220 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
25230 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
25240 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
25250 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
25260 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
25270 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
25280 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
25290 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
252a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
252b0 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
252c0 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
252d0 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
252e0 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70  r==pPager || (*p
252f0 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
25300 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70  0 );..  if( (*pp
25310 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 29 7b  Page)->pPager ){
25320 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
25330 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
25340 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
25350 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
25360 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
25370 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
25380 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
25390 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
253a0 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
253b0 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
253c0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
253d0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
253e0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
253f0 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65  r->nHit);.    re
25400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25410 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25420 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
25430 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
25440 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
25450 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
25460 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
25470 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e  ized.  */.    in
25480 74 20 6e 4d 61 78 3b 0a 0a 20 20 20 20 50 41 47  t nMax;..    PAG
25490 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
254a0 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20  nMiss);.    pPg 
254b0 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70  = *ppPage;.    p
254c0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
254d0 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ger;..    /* The
254e0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
254f0 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
25500 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
25510 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
25520 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
25530 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
25540 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63  r the unused loc
25550 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65  king-page, is re
25560 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20  quested. */.    
25570 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
25580 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
25590 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
255a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
255b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
255c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
255d0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
255e0 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
255f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25600 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
25610 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20  ager, &nMax);.  
25620 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25630 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
25640 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
25650 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
25660 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 6e 4d 61  if( MEMDB || nMa
25670 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e  x<(int)pgno || n
25680 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f  oContent || !isO
25690 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
256a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
256b0 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
256c0 20 29 7b 0a 09 72 63 20 3d 20 53 51 4c 49 54 45   ){..rc = SQLITE
256d0 5f 46 55 4c 4c 3b 0a 09 67 6f 74 6f 20 70 61 67  _FULL;..goto pag
256e0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
256f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25700 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
25710 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
25720 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
25730 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
25740 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
25750 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
25760 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
25770 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
25780 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
25790 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
257a0 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
257b0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
257c0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
257d0 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
257e0 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
257f0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
25800 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
25810 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
25820 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
25830 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
25840 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
25850 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
25860 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25870 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
25880 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
25890 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
258a0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
258b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
258c0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
258d0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
258e0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
258f0 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
25900 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
25920 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
25930 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
25940 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
25950 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
25960 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
25970 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25980 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
25990 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
259a0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
259b0 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
259c0 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
259d0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
259e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
259f0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
25a00 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
25a10 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
25a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
25a30 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
25a40 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
25a50 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
25a60 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
25a70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25a80 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
25a90 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
25aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25ab0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
25ac0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
25ad0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
25ae0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
25af0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
25b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25b10 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
25b20 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
25b30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25b40 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
25b50 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
25b60 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
25b70 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
25b80 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
25b90 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
25ba0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25bb0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
25bc0 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
25bd0 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
25be0 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
25bf0 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
25c00 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
25c10 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
25c20 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
25c30 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
25c40 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
25c50 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e  he. Also, return
25c60 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61   0 if the .** pa
25c70 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
25c80 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
25c90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
25ca0 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72  is called,.** or
25cb0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
25cc0 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
25cd0 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
25ce0 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  LITE_FULL..**.**
25cf0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
25d00 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
25d10 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
25d20 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
25d30 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
25d40 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
25d50 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
25d60 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
25d70 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
25d80 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
25d90 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
25da0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
25db0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
25dc0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
25dd0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
25de0 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
25df0 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
25e00 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
25e10 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
25e20 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
25e30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25e40 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
25e50 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
25e60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
25e70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
25e80 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno!=0 );.  asse
25e90 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61  rt( pPager->pPCa
25ea0 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  che!=0 );.  asse
25eb0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
25ec0 65 20 3e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e > PAGER_UNLOCK
25ed0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   );.  sqlite3Pca
25ee0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
25ef0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
25f00 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75  0, &pPg);.  retu
25f10 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
25f20 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
25f30 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
25f40 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
25f50 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
25f60 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
25f70 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
25f80 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
25f90 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
25fa0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
25fb0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
25fc0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
25fd0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
25fe0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
25ff0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
26000 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
26010 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
26020 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
26030 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
26040 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
26050 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
26060 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  >pPager;.    sql
26070 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
26080 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65  e(pPg);.    page
26090 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
260a0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
260b0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  /*.** If the mai
260c0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
260d0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
260e0 6f 70 65 6e 65 64 2c 20 65 6e 73 75 72 65 20 74  opened, ensure t
260f0 68 61 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a  hat the.** sub-j
26100 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
26110 70 65 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65 20  pen too. If the 
26120 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20  main journal is 
26130 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69  not open,.** thi
26140 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
26150 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
26160 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26170 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
26180 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
26190 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20  to plan. .** An 
261a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
261b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
261c0 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
261d0 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  l to .** sqlite3
261e0 4f 73 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a  OsOpen() fails..
261f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
26200 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
26210 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26220 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26230 4b 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  K;.  if( isOpen(
26240 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
26250 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
26260 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
26270 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26280 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
26290 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
262a0 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
262b0 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
262c0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
262d0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
262e0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
262f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26300 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
26310 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
26320 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
26330 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
26340 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26350 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26360 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
26370 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
26380 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
26390 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
263a0 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
263b0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
263c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
263d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
263e0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
263f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
26400 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
26410 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26420 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
26430 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
26440 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
26450 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
26460 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
26470 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
26480 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
26490 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
264a0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
264b0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
264c0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
264d0 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
264e0 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
264f0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
26500 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
26510 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
26520 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
26530 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
26540 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
26550 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
26560 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
26570 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
26580 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
26590 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
265a0 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
265b0 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
265c0 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
265d0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
265e0 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
265f0 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
26600 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
26610 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
26620 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
26630 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
26640 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
26650 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
26660 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
26670 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
26680 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
26690 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
266a0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
266b0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
266c0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
266d0 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
266e0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
266f0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
26700 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
26710 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
26720 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
26730 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
26740 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
26750 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
26760 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
26770 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26790 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
267a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
267b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
267c0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
267f0 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
26800 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
26810 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
26820 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
26830 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
26840 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
26850 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
26860 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
26870 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
26880 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26890 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
268a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
268b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
268c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
268d0 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OFF );.  assert(
268e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
268f0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
26900 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
26910 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
26920 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26930 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  s a no-op.  But 
26940 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65  on.  ** the othe
26950 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75  r hand, this rou
26960 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
26970 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61  lled if we are a
26980 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61  lready in.  ** a
26990 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  n error state. *
269a0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
269b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
269c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
269d0 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74 65 73 74  errCode;..  test
269e0 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62  case( pPager->db
269f0 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
26a00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
26a10 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
26a20 26 6e 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  &nPage);.  pPage
26a30 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
26a40 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
26a50 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66  ate(nPage);.  if
26a60 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
26a70 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
26a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
26a90 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  EM;.  }..  /* Op
26aa0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
26ab0 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
26ac0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
26ad0 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
26ae0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
26af0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
26b00 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
26b10 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
26b20 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73  EMORY ){.      s
26b30 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
26b40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26b50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26b60 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
26b70 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20  ags =           
26b80 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
26b90 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75  lags to open jou
26ba0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20  rnal file */.   
26bb0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
26bc0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
26bd0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
26be0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
26bf0 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20  tempFile ? .    
26c00 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
26c10 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
26c20 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
26c30 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20  P_JOURNAL):.    
26c40 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
26c50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
26c60 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64  .        );.#ifd
26c70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
26c80 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
26c90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26ca0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
26cb0 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
26cc0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
26cd0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
26ce0 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  s, jrnlBufferSiz
26cf0 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20  e(pPager).      
26d00 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72  );.#else.      r
26d10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
26d20 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
26d30 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
26d40 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
26d50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
26d60 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
26d70 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
26d80 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26d90 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72  );.  }...  /* Wr
26da0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
26db0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
26dc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26dd0 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20   and open .  ** 
26de0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
26df0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
26e00 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
26e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
26e20 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
26e30 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
26e40 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
26e50 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
26e60 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
26e70 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
26e80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
26e90 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
26ea0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
26eb0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
26ec0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
26ed0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
26ee0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  lOff = 0;.    pP
26ef0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
26f00 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
26f10 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
26f20 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a  .    rc = writeJ
26f30 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
26f40 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
26f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
26f60 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
26f70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
26f80 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
26f90 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
26fa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
26fc0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
26fd0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
26fe0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
26ff0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  urnal = 0;.  }. 
27000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27010 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
27020 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
27030 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
27040 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
27050 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
27060 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
27070 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
27080 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
27090 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
270a0 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
270b0 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
270c0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
270d0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
270e0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
270f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27100 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  . If exFlag is t
27110 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  rue, then acquir
27120 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
27130 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
27140 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
27150 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
27160 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
27170 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
27180 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
27190 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
271a0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
271b0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64  -memory file and
271c0 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
271d0 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64  le is .** opened
271e0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62   if it has not b
271f0 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f 72  een already. For
27200 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
27210 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a  e, the opening .
27220 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** of the journa
27230 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
27240 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
27250 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65 65 64  s an actual need
27260 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f   to .** write to
27270 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f   the journal. TO
27280 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65 20 74  DO: Why handle t
27290 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 64  emporary files d
272a0 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a  ifferently?.**.*
272b0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
272c0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
272d0 28 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72  (or if it is alr
272e0 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e  eady open), then
272f0 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65   a.** journal-he
27300 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
27310 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
27320 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  it..**.** If the
27330 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
27340 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
27350 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
27360 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
27370 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
27380 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
27390 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
273a0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
273b0 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
273c0 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
273d0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
273e0 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
273f0 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
27400 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
27410 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
27420 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
27430 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
27440 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
27450 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
27460 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
27470 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
27480 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
27490 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
274a0 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
274b0 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
274c0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
274d0 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
274e0 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
274f0 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
27500 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27510 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
27520 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
27530 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
27540 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
27550 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27570 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
27580 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67 65 72  LOCK );.  pPager
27590 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
275a0 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
275b0 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  y;.  if( pPager-
275c0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
275d0 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
275e0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
275f0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
27600 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
27610 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
27620 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  File );..    /* 
27630 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
27640 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
27650 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
27660 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
27670 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 74  eter.    ** is t
27680 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
27690 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
276a0 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
276b0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
276c0 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
276d0 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
276e0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
276f0 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
27700 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63  USIVE.    ** loc
27710 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
27720 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
27730 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
27740 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
27750 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
27760 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
27770 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
27780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27790 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
277a0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
277b0 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  RVED;.      if( 
277c0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
277d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
277e0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
277f0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
27800 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27810 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ..    /* No need
27820 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
27830 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 69  rnal file at thi
27840 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c  s time.  It will
27850 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65   be.    ** opene
27860 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  d before it is w
27870 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66 20 77  ritten to.  If w
27880 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e 67 20  e defer opening 
27890 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20  the journal,.   
278a0 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73 61 76   ** we might sav
278b0 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 63 72  e the work of cr
278c0 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 66  eating a file if
278d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
278e0 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75 70 20  .    ** ends up 
278f0 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20  being a no-op.. 
27900 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66     */.  }else if
27910 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27920 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
27930 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
27940 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
27950 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70  ppens when the p
27960 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c  ager was in excl
27970 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
27980 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a  e the last.    *
27990 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f  * time a (read o
279a0 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
279b0 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
279c0 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a  fully concluded.
279d0 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63      ** by this c
279e0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65  onnection. Inste
279f0 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74  ad of deleting t
27a00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27a10 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b  it was .    ** k
27a20 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74  ept open and eit
27a30 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65  her was truncate
27a40 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20  d to 0 bytes or 
27a50 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20  its header was. 
27a60 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65     ** overwritte
27a70 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
27a80 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
27a90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30   pPager->nRec==0
27aa0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27ab0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
27ac0 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
27ad0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
27ae0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
27af0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
27b00 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
27b10 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
27b20 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
27b30 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
27b40 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 69  D(pPager)));.  i
27b50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27b60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27b70 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
27b80 69 65 64 20 29 3b 0a 20 20 20 20 2f 2a 20 49 67  ied );.    /* Ig
27b90 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72 6f  nore any IO erro
27ba0 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 77 69  r that occurs wi
27bb0 74 68 69 6e 20 70 61 67 65 72 5f 65 6e 64 5f 74  thin pager_end_t
27bc0 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e 20 54 68  ransaction(). Th
27bd0 65 0a 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65  e.    ** purpose
27be0 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   of this call is
27bf0 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 69 6e   to reset the in
27c00 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
27c10 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
27c20 20 73 75 62 2d 73 79 73 74 65 6d 2e 20 49 74 20   sub-system. It 
27c30 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 69  doesn't matter i
27c40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  f the journal-fi
27c50 6c 65 20 69 73 20 6e 6f 74 20 70 72 6f 70 65 72  le is not proper
27c60 6c 79 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 69  ly.    ** finali
27c70 7a 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  zed at this poin
27c80 74 20 28 73 69 6e 63 65 20 69 74 20 69 73 20 6e  t (since it is n
27c90 6f 74 20 61 20 76 61 6c 69 64 20 6a 6f 75 72 6e  ot a valid journ
27ca0 61 6c 20 66 69 6c 65 20 61 6e 79 77 61 79 29 2e  al file anyway).
27cb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 61 67 65  .    */.    page
27cc0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
27cd0 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
27ce0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27cf0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
27d00 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
27d10 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
27d20 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
27d30 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
27d40 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
27d50 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
27d60 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
27d70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
27d80 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
27d90 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
27da0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
27db0 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
27dc0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
27dd0 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
27de0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
27df0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
27e00 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
27e10 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
27e20 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
27e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27e40 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
27e50 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
27e60 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
27e70 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
27e80 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
27e90 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
27ea0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
27eb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27ec0 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
27ed0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
27ee0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
27ef0 0a 20 20 2a 2a 20 73 74 61 72 74 65 64 2e 0a 20  .  ** started.. 
27f00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
27f10 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
27f20 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a  ER_RESERVED );..
27f30 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
27f40 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f   has been previo
27f50 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72  usly detected, r
27f60 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65  eport the same e
27f70 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e  rror.  ** again.
27f80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
27f90 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 20 72  er->errCode )  r
27fa0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
27fb0 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67  rCode;..  /* Hig
27fc0 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her-level routin
27fd0 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  es never call th
27fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64  is function if d
27ff0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20  atabase is not. 
28000 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42   ** writable.  B
28010 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c  ut check anyway,
28020 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74   just for robust
28030 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  ness. */.  if( N
28040 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61  EVER(pPager->rea
28050 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  dOnly) ) return 
28060 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20  SQLITE_PERM;..  
28070 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
28080 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
28090 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
280a0 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
280b0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
280c0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
280d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
280e0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
280f0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
28100 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
28110 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
28120 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
28130 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
28140 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
28150 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
28160 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
28170 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
28180 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
28190 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
281a0 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
281b0 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
281c0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
281d0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
281e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
281f0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
28200 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
28210 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
28220 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
28230 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65 72 20  *.    ** Higher 
28240 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 73  level routines s
28250 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
28260 64 79 20 73 74 61 72 74 65 64 20 61 20 74 72 61  dy started a tra
28270 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a  nsaction,.    **
28280 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65   which means the
28290 79 20 68 61 76 65 20 61 63 71 75 69 72 65 64 20  y have acquired 
282a0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
282b0 63 6b 73 20 62 75 74 20 74 68 65 20 72 6f 6c 6c  cks but the roll
282c0 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
282d0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
282e0 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a  t be open..    *
282f0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
28300 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 61  e3PagerBegin(pPa
28310 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ger, 0, pPager->
28320 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20  subjInMemory);. 
28330 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
28350 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28360 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
28370 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
28380 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
28390 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
283a0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
283b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
283c0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
283d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
283e0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
283f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
28400 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28410 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28420 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
28430 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
28440 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
28450 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
28460 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
28470 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
28480 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
28490 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
284a0 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
284b0 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
284c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
284d0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
284e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
284f0 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
28500 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
28510 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
28520 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
28530 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  g) && isOpen(pPa
28540 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
28550 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
28560 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
28570 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
28580 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
28590 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
285a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  ..        /* We 
285b0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
285c0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
285d0 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
285e0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
285f0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
28600 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
28610 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
28620 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
28630 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
28640 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
28650 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
28660 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
28670 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
28680 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
28690 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
286a0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
286b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
286c0 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
286d0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
286e0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
286f0 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
28700 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
28710 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
28720 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28730 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
28740 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
28750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28760 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28770 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
28780 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
28790 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
287a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
287d0 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20  ff + 4);.       
287e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
287f0 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
28800 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20  >pageSize+4;.   
28810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28820 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
28840 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
28850 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28860 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
28870 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
28880 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28890 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20  lOff += 4;.     
288a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
288b0 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
288c0 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
288d0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
288e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
288f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28900 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
28910 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
28920 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
28930 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
28940 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
28950 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28960 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
28970 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
28980 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
28990 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
289a0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
289b0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
289c0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
289d0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
289e0 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
289f0 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
28a00 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e  .        /* Even
28a10 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73   if an IO or dis
28a20 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75  kfull error occu
28a30 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e  rred while journ
28a40 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  alling the.     
28a50 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
28a60 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
28a70 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
28a80 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
28a90 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ge..        ** O
28aa0 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
28ab0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
28ac0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
28ad0 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20  he logic in.    
28ae0 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f      ** playback_
28af0 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
28b00 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
28b10 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
28b20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  restored.       
28b30 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
28b40 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
28b50 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
28b60 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
28b70 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
28b80 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
28b90 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20  ay follow..     
28ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28bb0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
28bc0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
28bd0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
28be0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
28bf0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28c00 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
28c10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
28c20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
28c30 20 6f 63 63 75 72 72 65 64 20 77 72 69 74 69 6e   occurred writin
28c40 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
28c50 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
28c60 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
28c70 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
28c80 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
28c90 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
28ca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28cb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
28cd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
28ce0 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  }..        pPage
28cf0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
28d00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28d10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
28d20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
28d30 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
28d40 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
28d50 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
28d60 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
28d70 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
28d80 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
28d90 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
28da0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
28db0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
28dc0 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
28dd0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
28de0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
28df0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
28e00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28e10 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
28e20 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
28e30 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
28e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
28e60 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
28e70 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
28e80 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
28e90 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
28ea0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
28eb0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
28ec0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
28ed0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
28ee0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
28ef0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
28f00 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
28f10 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
28f20 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
28f30 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
28f40 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
28f50 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
28f60 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
28f70 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
28f80 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d  ?1:0)));.      }
28f90 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
28fa0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
28fb0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
28fc0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
28fd0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
28fe0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
28ff0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
29000 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
29010 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
29020 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
29030 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
29040 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
29050 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
29060 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
29070 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
29080 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
29090 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
290a0 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
290b0 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
290c0 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
290d0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
290e0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
290f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
29100 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
29110 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
29120 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
29130 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
29140 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
29150 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
29160 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
29170 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
29180 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
29190 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
291a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
291b0 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
291c0 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
291d0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
291e0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
291f0 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e   .** making chan
29200 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54  ges to a page. T
29210 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
29220 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
29230 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69  value .** of thi
29240 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62  s function and b
29250 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
29260 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
29270 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a   data unless .**
29280 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
29290 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
292a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
292b0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
292c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
292d0 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
292e0 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
292f0 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
29300 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
29310 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
29320 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
29330 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
29340 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
29350 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
29360 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
29370 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
29380 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
29390 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
293a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
293b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
293c0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
293d0 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
293e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
293f0 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70  eturned.** as ap
29400 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72  propriate. Other
29410 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
29420 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
29430 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
29440 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
29450 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29460 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
29470 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
29480 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
29490 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
294a0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
294b0 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
294c0 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
294d0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  geSize);..  if( 
294e0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
294f0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
29500 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
29510 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
29520 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
29530 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
29540 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29560 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
29570 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
29580 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
29590 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
295a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
295b0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
295c0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
295d0 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
295e0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
295f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29600 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
29610 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
29620 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
29630 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65  True if any page
29640 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f   has PGHDR_NEED_
29650 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  SYNC */..    /* 
29660 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
29670 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
29680 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
29690 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
296a0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
296b0 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
296c0 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
296d0 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
296e0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
296f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
29700 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
29710 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29720 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
29730 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
29740 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20  NotSync = 1;..  
29750 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
29760 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
29770 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
29780 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
29790 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
297a0 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
297b0 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
297c0 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
297d0 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
297e0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
297f0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
29800 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
29810 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
29820 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
29830 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
29840 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
29850 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
29860 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
29870 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43  , (int *)&nPageC
29880 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ount);.    if( p
29890 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
298a0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
298b0 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
298c0 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
298d0 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
298e0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
298f0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
29900 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
29910 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
29920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
29930 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
29940 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
29950 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
29960 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
29970 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
29980 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
29990 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
299a0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
299b0 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
299c0 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
299d0 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
299e0 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
299f0 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
29a00 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
29a10 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
29a20 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
29a30 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
29a40 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
29a50 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
29a60 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
29a70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
29a80 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
29a90 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
29aa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29ad0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
29ae0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29af0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
29b00 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
29b10 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
29b20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
29b30 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
29b40 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
29b50 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
29b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29b70 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
29b80 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
29b90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29ba0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
29bb0 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
29bc0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
29bd0 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20  r, pg))!=0 ){.  
29be0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
29bf0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
29c00 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
29c10 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
29c20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29c30 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
29c40 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
29c50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
29c60 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52   /* If the PGHDR
29c70 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
29c80 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f  is set for any o
29c90 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65  f the nPage page
29ca0 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  s .    ** starti
29cb0 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20  ng at pg1, then 
29cc0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
29cd0 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  et for all of th
29ce0 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20  em. Because.    
29cf0 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
29d00 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
29d10 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
29d20 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
29d30 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
29d40 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61   file must conta
29d50 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69  in sync()ed copi
29d60 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  es of all of the
29d70 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  m.    ** before 
29d80 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20  any of them can 
29d90 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  be written out t
29da0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29db0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
29dc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29dd0 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b  K && needSync ){
29de0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
29df0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
29e00 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  >noSync==0 );.  
29e10 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
29e20 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  <nPage; ii++){. 
29e30 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
29e40 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
29e50 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
29e60 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
29e70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
29e80 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20     pPage->flags 
29e90 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
29ea0 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  NC;.          sq
29eb0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
29ec0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
29ed0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
29ee0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
29ef0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
29f00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
29f10 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
29f20 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
29f30 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
29f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
29f50 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
29f60 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
29f70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29f80 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
29f90 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
29fa0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
29fb0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
29fc0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
29fd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
29fe0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
29ff0 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
2a000 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
2a010 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
2a020 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
2a030 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2a040 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
2a050 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
2a060 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
2a070 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
2a080 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
2a090 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
2a0a0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
2a0b0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
2a0c0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
2a0d0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
2a0e0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
2a0f0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
2a100 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
2a110 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
2a120 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
2a130 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
2a140 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
2a150 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
2a160 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
2a170 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
2a180 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
2a190 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2a1a0 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
2a1b0 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
2a1c0 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
2a1d0 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
2a1e0 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
2a1f0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
2a200 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
2a210 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
2a220 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
2a230 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61  ed. The pager ma
2a240 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
2a250 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
2a260 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
2a270 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2a280 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
2a290 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
2a2a0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75  imization can qu
2a2b0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
2a2c0 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44  d of large .** D
2a2d0 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
2a2e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a2f0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2a300 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2a310 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2a320 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
2a330 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2a340 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50  HDR_DIRTY) && pP
2a350 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2a360 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52  ==0 ){.    PAGER
2a370 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49  TRACE(("DONT_WRI
2a380 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
2a390 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
2a3a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2a3b0 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
2a3c0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
2a3d0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
2a3e0 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c  no)).    pPg->fl
2a3f0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e  ags |= PGHDR_DON
2a400 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20  T_WRITE;.#ifdef 
2a410 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
2a420 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
2a430 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
2a440 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
2a450 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
2a460 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2a470 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
2a480 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
2a490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a4a0 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
2a4b0 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
2a4c0 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
2a4d0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
2a4e0 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
2a4f0 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
2a500 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
2a510 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
2a520 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73  rectMode flag is
2a530 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
2a540 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c   is done by call
2a550 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
2a560 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70  agerWrite() on p
2a570 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69  age 1, then modi
2a580 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
2a590 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  ts of the.** pag
2a5a0 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20  e data. In this 
2a5b0 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69  case the file wi
2a5c0 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68  ll be updated wh
2a5d0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
2a5e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
2a5f0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2a600 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f  * The isDirectMo
2a610 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79  de flag may only
2a620 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20   be non-zero if 
2a630 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
2a640 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
2a650 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
2a660 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  LE_ATOMIC_WRITE 
2a670 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49  macro defined. I
2a680 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
2a690 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e  if isDirect is n
2a6a0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
2a6b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a6c0 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63  is updated direc
2a6d0 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e  tly.** by writin
2a6e0 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72  g an updated ver
2a6f0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75  sion of page 1 u
2a700 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74  sing a call to t
2a710 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  he .** sqlite3Os
2a720 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
2a730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a740 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2a750 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
2a760 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
2a770 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74  rectMode){.  int
2a780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a790 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61  ..  /* Declare a
2a7a0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  nd initialize co
2a7b0 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27  nstant integer '
2a7c0 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68  isDirect'. If th
2a7d0 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  e.  ** atomic-wr
2a7e0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2a7f0 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74   is enabled in t
2a800 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  his build, then 
2a810 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73  isDirect.  ** is
2a820 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
2a830 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
2a840 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74   as the isDirect
2a850 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20  Mode parameter. 
2a860 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63   ** to this func
2a870 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
2a880 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65   it is always se
2a890 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  t to zero..  **.
2a8a0 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73    ** The idea is
2a8b0 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f   that if the ato
2a8c0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2a8d0 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  zation is not.  
2a8e0 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ** enabled at co
2a8f0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20  mpile time, the 
2a900 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69  compiler can omi
2a910 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20  t the tests of. 
2a920 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62   ** 'isDirect' b
2a930 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73  elow, as well as
2a940 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f   the block enclo
2a950 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
2a960 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22  "if( isDirect )"
2a970 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f   condition..  */
2a980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a990 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2a9a0 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52  ITE.# define DIR
2a9b0 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73  ECT_MODE 0.  ass
2a9c0 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64  ert( isDirectMod
2a9d0 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  e==0 );.  UNUSED
2a9e0 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72  _PARAMETER(isDir
2a9f0 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  ectMode);.#else.
2aa00 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
2aa10 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64  MODE isDirectMod
2aa20 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  e.#endif..  asse
2aa30 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2aa40 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
2aa50 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  D );.  if( !pPag
2aa60 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2aa70 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64  one && pPager->d
2aa80 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50  bSize>0 ){.    P
2aa90 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20  gHdr *pPgHdr;   
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aab0 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  Reference to pag
2aac0 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63  e 1 */.    u32 c
2aad0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20  hange_counter;  
2aae0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
2aaf0 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61  ial value of cha
2ab00 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
2ab10 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  d */..    assert
2ab20 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
2ab30 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ile && isOpen(pP
2ab40 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
2ab50 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
2ab60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
2ab70 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
2ab80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ab90 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
2aba0 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61   &pPgHdr);.    a
2abb0 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30  ssert( pPgHdr==0
2abc0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
2abd0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
2abe0 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74  page one was fet
2abf0 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ched successfull
2ac00 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  y, and this func
2ac10 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20  tion is not.    
2ac20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  ** operating in 
2ac30 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b  direct-mode, mak
2ac40 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c  e page 1 writabl
2ac50 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20  e.  When not in 
2ac60 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d  .    ** direct m
2ac70 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61  ode, page 1 is a
2ac80 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61  lways held in ca
2ac90 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68  che and hence th
2aca0 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20  e PagerGet().   
2acb0 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77   ** above is alw
2acc0 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d  ays successful -
2acd0 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59   hence the ALWAY
2ace0 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f  S on rc==SQLITE_
2acf0 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  OK..    */.    i
2ad00 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20  f( !DIRECT_MODE 
2ad10 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51  && ALWAYS(rc==SQ
2ad20 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
2ad30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ad40 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
2ad50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2ad60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ad70 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65  {.      /* Incre
2ad80 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
2ad90 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
2ada0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
2adb0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20  te 24. */.      
2adc0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
2add0 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
2ade0 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
2adf0 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20  FileVers);.     
2ae00 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
2ae10 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  +;.      put32bi
2ae20 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
2ae30 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  r->pData)+24, ch
2ae40 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
2ae50 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74        /* Also st
2ae60 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76  ore the SQLite v
2ae70 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e  ersion number in
2ae80 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 2a 2f   bytes 96..99 */
2ae90 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73  .      put32bits
2aea0 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
2aeb0 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
2aec0 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
2aed0 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  R);..      /* If
2aee0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65   running in dire
2aef0 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74  ct mode, write t
2af00 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
2af10 61 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c  age 1 to the fil
2af20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
2af30 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20  DIRECT_MODE ){. 
2af40 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
2af50 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72  d *zBuf = pPgHdr
2af60 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->pData;.       
2af70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2af80 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b  >dbFileSize>0 );
2af90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2afa0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2afb0 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
2afc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2afd0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2afe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2aff0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
2b000 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2b010 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  one = 1;.       
2b020 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2b030 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2b040 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2b050 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2b060 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
2b070 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
2b080 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
2b090 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2b0a0 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  pPgHdr);.  }.  r
2b0b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b0c0 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65  ** Sync the page
2b0d0 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20  r file to disk. 
2b0e0 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
2b0f0 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  for in-memory fi
2b100 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20  les.** or pages 
2b110 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e  with the Pager.n
2b120 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a  oSync flag set..
2b130 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2b140 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f  ful, or called o
2b150 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
2b160 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
2b170 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
2b180 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2b190 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
2b1a0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
2b1b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
2b1c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2b1d0 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
2b1e0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2b1f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b210 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2b220 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
2b230 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
2b240 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2b250 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b260 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2b270 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2b280 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
2b290 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
2b2a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b2b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
2b2c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b2d0 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
2b2e0 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
2b2f0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
2b300 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
2b310 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
2b320 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
2b330 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
2b340 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
2b350 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
2b360 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
2b370 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
2b380 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
2b390 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
2b3a0 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
2b3b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
2b3c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b3d0 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a  e ensures that:.
2b3e0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  **.**   * The da
2b3f0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2b400 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70  ge-counter is up
2b410 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68  dated,.**   * th
2b420 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
2b430 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20  ced (unless the 
2b440 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2b450 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
2b460 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64  d),.**   * all d
2b470 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77  irty pages are w
2b480 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
2b490 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a  tabase file, .**
2b4a0 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2b4b0 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  e file is trunca
2b4c0 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64  ted (if required
2b4d0 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  ), and.**   * th
2b4e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b4f0 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  synced. .**.** T
2b500 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
2b510 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  at remains to co
2b520 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
2b530 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c  tion is to final
2b540 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c  ize .** (delete,
2b550 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
2b560 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  o the first part
2b570 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c   of) the journal
2b580 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65   file (or .** de
2b590 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
2b5a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2b5b0 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
2b5c0 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
2b5d0 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
2b5e0 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
2b5f0 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
2b600 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
2b610 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
2b620 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
2b630 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
2b640 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
2b650 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
2b660 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
2b670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b680 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
2b690 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
2b6a0 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
2b6b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
2b6c0 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
2b6d0 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
2b6e0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
2b6f0 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
2b700 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
2b710 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
2b720 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
2b730 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
2b740 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
2b750 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
2b760 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
2b770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2b780 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
2b790 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
2b7a0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2b7b0 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  * If not NULL, t
2b7c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2b7d0 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  l name */.  int 
2b7e0 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  noSync          
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b800 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  rue to omit the 
2b810 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20  xSync on the db 
2b820 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2b830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b850 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2b860 20 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53    /* The dbOrigS
2b870 69 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65 74  ize is never set
2b880 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
2b890 3d 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74  =OFF */.  assert
2b8a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2b8b0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2b8c0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20  RNALMODE_OFF || 
2b8d0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2b8e0 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ze==0 );..  /* I
2b8f0 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
2b900 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74  occurred, report
2b910 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69   that error agai
2b920 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  n. */.  if( pPag
2b930 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
2b940 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2b950 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52  Code;..  PAGERTR
2b960 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53  ACE(("DATABASE S
2b970 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
2b980 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64  ster=%s nSize=%d
2b990 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
2b9a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2b9b0 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
2b9c0 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28  dbSize));..  if(
2b9d0 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72   MEMDB && pPager
2b9e0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
2b9f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2ba00 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
2ba10 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
2ba20 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
2ba30 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20   to, or this.   
2ba40 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
2ba50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2ba60 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74  lled, it is most
2ba70 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77  ly a no-op.  How
2ba80 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a  ever, any.    **
2ba90 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72   backup in progr
2baa0 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ess needs to be 
2bab0 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a  restarted..    *
2bac0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  /.    sqlite3Bac
2bad0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
2bae0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d  r->pBackup);.  }
2baf0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
2bb00 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
2bb10 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  NCED && pPager->
2bb20 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20  dbModified ){.. 
2bb30 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
2bb40 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  ing block update
2bb50 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
2bb60 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f  nter. Exactly ho
2bb70 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  w it.    ** does
2bb80 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e   this depends on
2bb90 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2bba0 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
2bbb0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  e optimization. 
2bbc0 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65     ** was enable
2bbd0 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2bbe0 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74  e, and if this t
2bbf0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73  ransaction meets
2bc00 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e   the .    ** run
2bc10 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f  time criteria to
2bc20 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69   use the operati
2bc30 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  on: .    **.    
2bc40 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65  **    * The file
2bc50 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
2bc60 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2bc70 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
2bc80 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
2bc90 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
2bca0 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a  ize, and .    **
2bcb0 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69      * This commi
2bcc0 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
2bcd0 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
2bce0 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
2bcf0 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74     **    * Exact
2bd00 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
2bd10 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
2bd20 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
2bd30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
2bd40 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
2bd50 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  e optimization w
2bd60 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61  as not enabled a
2bd70 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2bd80 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
2bd90 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2bda0 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74  ecounter() funct
2bdb0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
2bdc0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2bdd0 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65  ge.    ** counte
2bde0 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d  r in 'indirect-m
2bdf0 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74  ode'. If the opt
2be00 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d  imization is com
2be10 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20  piled in but.   
2be20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69   ** is not appli
2be30 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72  cable to this tr
2be40 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20  ansaction, call 
2be50 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
2be60 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f  eate().    ** to
2be70 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a   make sure the j
2be80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
2be90 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72  actually been cr
2bea0 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c  eated, then call
2beb0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e  .    ** pager_in
2bec0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2bed0 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
2bee0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2bef0 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20  in indirect.    
2bf00 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a  ** mode. .    **
2bf10 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
2bf20 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  e, if the optimi
2bf30 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65  zation is both e
2bf40 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69  nabled and appli
2bf50 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68  cable,.    ** th
2bf60 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e  en call pager_in
2bf70 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2bf80 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
2bf90 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a   change-counter.
2bfa0 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63      ** in 'direc
2bfb0 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73  t' mode. In this
2bfc0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2bfd0 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65  l file will neve
2bfe0 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  r be.    ** crea
2bff0 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
2c000 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  nsaction..    */
2c010 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2c020 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2c030 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  TE.    PgHdr *pP
2c040 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  g;.    assert( i
2c050 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2c060 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  d) || pPager->jo
2c070 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2c080 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2c090 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61   );.    if( !zMa
2c0a0 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70  ster && isOpen(p
2c0b0 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20  Pager->jfd) .   
2c0c0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
2c0d0 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
2c0e0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
2c0f0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2c100 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d  >dbSize>=pPager-
2c110 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20  >dbFileSize.    
2c120 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73   && (0==(pPg = s
2c130 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2c140 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2c150 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50  Cache)) || 0==pP
2c160 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29  g->pDirty).    )
2c170 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  {.      /* Updat
2c180 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68  e the db file ch
2c190 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61  ange counter via
2c1a0 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69 74   the direct-writ
2c1b0 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20  e method. The . 
2c1c0 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
2c1d0 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69  g call will modi
2c1e0 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  fy the in-memory
2c1f0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2c200 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20  of page 1 .     
2c210 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74   ** to include t
2c220 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67  he updated chang
2c230 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
2c240 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
2c250 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74  .      ** direct
2c260 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
2c270 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65  se file. Because
2c280 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   of the atomic-w
2c290 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 70  rite .      ** p
2c2a0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
2c2b0 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
2c2c0 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20   this is safe.. 
2c2d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2c2e0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
2c2f0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
2c300 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  er, 1);.    }els
2c310 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
2c320 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
2c330 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  te(pPager->jfd);
2c340 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2c350 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c360 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
2c370 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2c380 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  r(pPager, 0);.  
2c390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73      }.    }.#els
2c3a0 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  e.    rc = pager
2c3b0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2c3c0 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
2c3d0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
2c3e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2c3f0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2c400 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20  _one_exit;..    
2c410 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
2c420 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
2c430 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
2c440 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
2c450 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e  ages.    ** bein
2c460 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
2c470 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
2c480 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
2c490 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
2c4a0 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63   ** file. This c
2c4b0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
2c4c0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
2c4d0 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
2c4e0 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67  * Before reading
2c4f0 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68 20   the pages with 
2c500 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72  page numbers lar
2c510 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
2c520 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c    ** current val
2c530 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
2c540 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62  ze, set dbSize b
2c550 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
2c560 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74 20  .    ** that it 
2c570 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61 72  took at the star
2c580 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
2c590 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
2c5a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   the.    ** call
2c5b0 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
2c5c0 72 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65  rGet() return ze
2c5d0 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65  roed pages inste
2c5e0 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65  ad of .    ** re
2c5f0 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20  ading data from 
2c600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c610 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2c620 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   When journal_mo
2c630 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f 72  de==OFF the dbOr
2c640 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79 73  igSize is always
2c650 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20   zero, so this. 
2c660 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65     ** block neve
2c670 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61  r runs if journa
2c680 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20  l_mode=OFF..    
2c690 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2c6a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2c6b0 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  M.    if( pPager
2c6c0 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  ->dbSize<pPager-
2c6d0 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
2c6e0 20 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 67    && ALWAYS(pPag
2c6f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2c700 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2c710 44 45 5f 4f 46 46 29 0a 20 20 20 20 29 7b 0a 20  DE_OFF).    ){. 
2c720 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20       Pgno i;    
2c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c750 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
2c760 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ble */.      con
2c770 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20  st Pgno iSkip = 
2c780 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2c790 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e  ager); /* Pendin
2c7a0 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20  g lock page */. 
2c7b0 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20       const Pgno 
2c7c0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
2c7d0 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  >dbSize;       /
2c7e0 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67 65  * Database image
2c7f0 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20   size */ .      
2c800 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
2c810 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
2c820 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  ize;.      for( 
2c830 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70  i=dbSize+1; i<=p
2c840 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2c850 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
2c860 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69    if( !sqlite3Bi
2c870 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
2c880 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20  >pInJournal, i) 
2c890 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
2c8a0 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a           PgHdr *
2c8b0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
2c8c0 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f     /* Page to jo
2c8d0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20  urnal */.       
2c8e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2c8f0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2c900 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
2c910 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c920 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2c930 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2c940 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
2c950 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c960 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  rWrite(pPage);. 
2c970 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c980 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
2c990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c9a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c9b0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2c9c0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
2c9d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a       }.      } .
2c9e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2c9f0 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20  Size = dbSize;. 
2ca00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2ca10 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
2ca20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
2ca30 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
2ca40 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61  al file. If a ma
2ca50 73 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75  ster .    ** jou
2ca60 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
2ca70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2ca80 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
2ca90 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20  ournal file, .  
2caa0 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74    ** or if zMast
2cab0 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d  er is NULL (no m
2cac0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20  aster journal), 
2cad0 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69  then this call i
2cae0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
2caf0 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  /.    rc = write
2cb00 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
2cb10 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
2cb20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cb30 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2cb40 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2cb50 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  it;..    /* Sync
2cb60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cb70 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63  e. If the atomic
2cb80 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
2cb90 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  tion is being.  
2cba0 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20    ** used, this 
2cbb0 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72  call will not cr
2cbc0 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eate the journal
2cbd0 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d   file or perform
2cbe0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c   any.    ** real
2cbf0 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   IO..    */.    
2cc00 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
2cc10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
2cc20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cc30 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2cc40 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20  ase_one_exit;.. 
2cc50 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
2cc60 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
2cc70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cc80 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61  . */.    rc = pa
2cc90 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
2cca0 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  st(sqlite3Pcache
2ccb0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2ccc0 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20  ->pPCache));.   
2ccd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2cce0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2ccf0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  rt( rc!=SQLITE_I
2cd00 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a  OERR_BLOCKED );.
2cd10 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69        goto commi
2cd20 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2cd30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2cd40 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
2cd50 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
2cd60 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  e);..    /* If t
2cd70 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
2cd80 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20  is not the same 
2cd90 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74 61  size as the data
2cda0 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20  base image,.    
2cdb0 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65  ** then use page
2cdc0 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72  r_truncate to gr
2cdd0 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65  ow or shrink the
2cde0 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
2cdf0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2ce00 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65  r->dbSize!=pPage
2ce10 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
2ce20 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77  .      Pgno nNew
2ce30 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2ce40 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53  e - (pPager->dbS
2ce50 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  ize==PAGER_MJ_PG
2ce60 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  NO(pPager));.   
2ce70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ce80 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2ce90 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20  EXCLUSIVE );.   
2cea0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
2ceb0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
2cec0 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
2ced0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2cee0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2cef0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
2cf00 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c  }..    /* Finall
2cf10 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  y, sync the data
2cf20 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2cf30 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
2cf40 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
2cf50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2cf60 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
2cf70 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
2cf80 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
2cf90 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
2cfa0 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
2cfb0 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
2cfc0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2cfd0 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
2cfe0 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e  .commit_phase_on
2cff0 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e  e_exit:.  return
2d000 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
2d010 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2d020 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
2d030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2d040 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  as been complete
2d050 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f  ly.** updated to
2d060 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61   reflect the cha
2d070 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65  nges made by the
2d080 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2d090 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63  tion and.** sync
2d0a0 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20  ed to disk. The 
2d0b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69  journal file sti
2d0c0 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ll exists in the
2d0d0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
2d0e0 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20   though, and if 
2d0f0 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
2d100 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
2d110 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  t will eventuall
2d120 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20  y.** be used as 
2d130 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
2d140 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  d the current tr
2d150 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64  ansaction rolled
2d160 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
2d170 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c  s function final
2d180 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
2d190 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79   file, either by
2d1a0 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74   deleting, .** t
2d1b0 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72  runcating or par
2d1c0 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69  tially zeroing i
2d1d0 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  t, so that it ca
2d1e0 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a  nnot be used .**
2d1f0 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   for hot-journal
2d200 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20   rollback. Once 
2d210 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65  this is done the
2d220 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
2d230 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63  ** irrevocably c
2d240 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
2d250 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2d260 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
2d270 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2d280 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a   and the pager.*
2d290 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65  * moves into the
2d2a0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74   error state. Ot
2d2b0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
2d2c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
2d2d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2d2e0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
2d2f0 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
2d300 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2d310 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2d320 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2d330 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2d340 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
2d350 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
2d360 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65 72  ed if a prior er
2d370 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
2d380 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64  ..  ** But if (d
2d390 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
2d3a0 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69  rror elsewhere i
2d3b0 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69 74  n the system) it
2d3c0 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63   does get.  ** c
2d3d0 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75  alled, just retu
2d3e0 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
2d3f0 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64  r code without d
2d400 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a  oing anything. *
2d410 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2d420 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2d430 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2d440 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54  errCode;..  /* T
2d450 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
2d460 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
2d470 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  d if the pager i
2d480 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73  s not in at leas
2d490 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53  t.  ** PAGER_RES
2d4a0 45 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e 64  ERVED state. And
2d4b0 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20 6e   indeed SQLite n
2d4c0 65 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e 20  ever does this. 
2d4d0 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e  But it is.  ** n
2d4e0 69 63 65 20 74 6f 20 68 61 76 65 20 74 68 69 73  ice to have this
2d4f0 20 64 65 66 65 6e 73 69 76 65 20 74 65 73 74 20   defensive test 
2d500 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  here anyway..  *
2d510 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2d520 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
2d530 52 5f 52 45 53 45 52 56 45 44 29 20 29 20 72 65  R_RESERVED) ) re
2d540 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2d550 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69  R;..  /* An opti
2d560 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  mization. If the
2d570 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e 6f   database was no
2d580 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
2d590 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  ied during.  ** 
2d5a0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2d5b0 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  , the pager is r
2d5c0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
2d5d0 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a  ive-mode and is.
2d5e0 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73 69    ** using persi
2d5f0 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20  stent journals, 
2d600 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2d610 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
2d620 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61   **.  ** The sta
2d630 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
2d640 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
2d650 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
2d660 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  le journal .  **
2d670 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68 65   header with the
2d680 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74 20   nRec field set 
2d690 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61 20  to 0. If such a 
2d6a0 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64 20  journal is used 
2d6b0 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  as.  ** a hot-jo
2d6c0 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f 74  urnal during hot
2d6d0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
2d6e0 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69 6c  k, 0 changes wil
2d6f0 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74  l be made.  ** t
2d700 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2d710 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69 73  ile. So there is
2d720 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f   no need to zero
2d730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
2d740 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63 65  ** header. Since
2d750 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
2d760 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
2d770 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2d780 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61  d.  ** to drop a
2d790 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e  ny locks either.
2d7a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
2d7b0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d  er->dbModified==
2d7c0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63  0 && pPager->exc
2d7d0 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
2d7e0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2d7f0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2d800 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
2d810 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
2d820 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2d830 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
2d840 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
2d850 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d860 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  E_OK;.  }..  PAG
2d870 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54  ERTRACE(("COMMIT
2d880 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2d890 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73  pPager)));.  ass
2d8a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2d8b0 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
2d8c0 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50   || MEMDB || !pP
2d8d0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2d8e0 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
2d8f0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
2d900 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
2d910 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72  >setMaster);.  r
2d920 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2d930 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
2d940 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
2d950 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68   all changes. Th
2d960 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
2d970 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
2d980 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  HARED mode..**.*
2d990 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2d9a0 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73  performs two tas
2d9b0 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  ks:.**.**   1) I
2d9c0 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  t rolls back the
2d9d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72   journal file, r
2d9e0 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74  estoring all dat
2d9f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a  abase file and .
2da00 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  **      in-memor
2da10 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74 6f  y cache pages to
2da20 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79 20   the state they 
2da30 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65  were in when the
2da40 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2da50 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c       was opened,
2da60 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20   and.**   2) It 
2da70 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
2da80 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74  urnal file, so t
2da90 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73  hat it is not us
2daa0 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20  ed for hot.**   
2dab0 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61     rollback at a
2dac0 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ny point in the 
2dad0 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75  future..**.** su
2dae0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c  bject to the fol
2daf0 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61  lowing qualifica
2db00 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49  tions:.**.** * I
2db10 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2db20 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  le is not yet op
2db30 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
2db40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2db50 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20  .**   then only 
2db60 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64  (2) is performed
2db70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2db80 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e  here is no journ
2db90 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20  al file.**   to 
2dba0 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  roll back..**.**
2dbb0 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f   * If in an erro
2dbc0 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
2dbd0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  an SQLITE_FULL, 
2dbe0 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73  then task (1) is
2dbf0 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64   .**   performed
2dc00 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2dc10 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72   task (2). Regar
2dc20 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
2dc30 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74  come.**   of eit
2dc40 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73  her, the error s
2dc50 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
2dc60 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
2dc70 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28  he caller.**   (
2dc80 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49  i.e. either SQLI
2dc90 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
2dca0 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
2dcb0 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67 65  ** * If the page
2dcc0 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45  r is in PAGER_RE
2dcd0 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
2dce0 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
2dcf0 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20  Whether.**   or 
2dd00 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63 75  not (1) is succu
2dd10 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65  ssful, also atte
2dd20 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63 63  mpt (2). If succ
2dd30 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
2dd40 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  *   SQLITE_OK. O
2dd50 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20  therwise, enter 
2dd60 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2dd70 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 66  and return the f
2dd80 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72  irst .**   error
2dd90 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65   code encountere
2dda0 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74  d. .**.**   In t
2ddb0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2ddc0 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
2ddd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
2dde0 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a  s written to. .*
2ddf0 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20 74  *   So is safe t
2de00 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
2de10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e  ournal file even
2de20 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b   if the playback
2de30 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f   .**   (operatio
2de40 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77  n 1) failed. How
2de50 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20 6d  ever the pager m
2de60 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65 72  ust enter the er
2de70 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61  ror state.**   a
2de80 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
2de90 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
2dea0 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75  cache are now su
2deb0 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46  spect..**.** * F
2dec0 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41  inally, if in PA
2ded0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74  GER_EXCLUSIVE st
2dee0 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70  ate, then attemp
2def0 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20  t (1). Only.**  
2df00 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66 20   attempt (2) if 
2df10 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75  (1) is successfu
2df20 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  l. Return SQLITE
2df30 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
2df40 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73  l,.**   otherwis
2df50 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  e enter the erro
2df60 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75  r state and retu
2df70 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
2df80 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20  e from the .**  
2df90 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69   failing operati
2dfa0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74  on..**.**   In t
2dfb0 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61 74  his case the dat
2dfc0 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68  abase file may h
2dfd0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
2dfe0 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a   to. So if the.*
2dff0 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  *   playback ope
2e000 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73  ration did not s
2e010 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20  ucceed it would 
2e020 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 66  not be safe to f
2e030 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65  inalize.**   the
2e040 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
2e050 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65  t needs to be le
2e060 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
2e070 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a  ystem so that.**
2e080 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72     some other pr
2e090 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69 74  ocess can use it
2e0a0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2e0b0 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20 28  database state (
2e0c0 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72  by.**   hot-jour
2e0d0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a  nal rollback)..*
2e0e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e0f0 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  erRollback(Pager
2e100 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2e110 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e130 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2e140 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45   */.  PAGERTRACE
2e150 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  (("ROLLBACK %d\n
2e160 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2e170 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61  r)));.  if( !pPa
2e180 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2e190 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
2e1a0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72  r->jfd) ){.    r
2e1b0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
2e1c0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2e1d0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2e1e0 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ter);.  }else if
2e1f0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
2e200 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
2e210 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
2e220 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
2e230 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2e240 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
2e250 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
2e260 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
2e270 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
2e280 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2e290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
2e2a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2e2b0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2e2c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
2e2d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2e2e0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
2e2f0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  r, 0);.      rc2
2e300 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
2e310 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
2e320 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
2e330 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
2e340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e350 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
2e360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2e370 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e380 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2e390 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
2e3a0 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
2e3b0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
2e3c0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
2e3d0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
2e3e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2e3f0 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
2e400 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
2e410 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
2e420 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63  e pager.    ** c
2e430 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
2e440 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
2e450 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
2e460 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
2e470 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
2e480 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2e490 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2e4a0 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ger, rc);.  }.  
2e4b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e4c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2e4d0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2e4e0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
2e4f0 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
2e500 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
2e510 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
2e520 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
2e530 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  le..*/.u8 sqlite
2e540 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
2e550 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e560 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2e570 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
2e580 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2e590 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2e5a0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2e5b0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2e5c0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
2e5d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e5e0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
2e5f0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
2e600 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2e610 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e620 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20  the approximate 
2e630 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2e640 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  of memory curren
2e650 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  tly.** used by t
2e660 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74 73  he pager and its
2e670 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63 68   associated cach
2e680 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2e690 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50 61  3PagerMemUsed(Pa
2e6a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2e6b0 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65 20  int perPageSize 
2e6c0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
2e6d0 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  ze + pPager->nEx
2e6e0 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74 75  tra + 20;.  retu
2e6f0 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a 73  rn perPageSize*s
2e700 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
2e710 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
2e720 43 61 63 68 65 29 0a 20 20 20 20 20 20 20 20 20  Cache).         
2e730 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f    + sqlite3Mallo
2e740 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d  cSize(pPager);.}
2e750 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2e760 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
2e770 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
2e780 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
2e790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e7a0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44  erPageRefcount(D
2e7b0 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  bPage *pPage){. 
2e7c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
2e7d0 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
2e7e0 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66  t(pPage);.}..#if
2e7f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2e800 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e810 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
2e820 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
2e830 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
2e840 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
2e850 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
2e860 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
2e870 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
2e880 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
2e890 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
2e8a0 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20  PCache);.  a[1] 
2e8b0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  = sqlite3PcacheP
2e8c0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
2e8d0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32  >pPCache);.  a[2
2e8e0 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2e8f0 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eGetCachesize(pP
2e900 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2e910 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
2e920 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28  >dbSizeValid ? (
2e930 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53  int) pPager->dbS
2e940 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d  ize : -1;.  a[4]
2e950 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
2e960 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
2e970 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
2e980 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
2e990 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
2e9a0 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
2e9b0 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
2e9c0 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
2e9d0 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
2e9e0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
2e9f0 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
2ea00 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
2ea10 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
2ea20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2ea30 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
2ea40 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
2ea50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2ea60 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
2ea70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2ea80 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a  urn MEMDB;.}../*
2ea90 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
2eaa0 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73  here are at leas
2eab0 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76  t nSavepoint sav
2eac0 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66  epoints open. If
2ead0 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75   there are.** cu
2eae0 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61  rrently less tha
2eaf0 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70  n nSavepoints op
2eb00 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e  en, then open on
2eb10 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
2eb20 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20  ints.** to make 
2eb30 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  up the differenc
2eb40 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  e. If the number
2eb50 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69   of savepoints i
2eb60 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75  s already.** equ
2eb70 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74  al to nSavepoint
2eb80 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2eb90 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2eba0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
2ebb0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
2ebc0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
2ebd0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  M is returned. I
2ebe0 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
2ebf0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
2ec00 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ing the sub-jour
2ec10 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61  nal file, then a
2ec20 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2ec30 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
2ec40 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
2ec50 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
2ec60 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
2ec70 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
2ec80 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70  ager, int nSavep
2ec90 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
2eca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecc0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2ecd0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72  e */.  int nCurr
2ece0 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  ent = pPager->nS
2ecf0 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
2ed00 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62   /* Current numb
2ed10 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
2ed20 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65   */..  if( nSave
2ed30 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26  point>nCurrent &
2ed40 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
2ed50 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
2ed60 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed80 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2ed90 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
2eda0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
2edb0 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  aNew;           
2edc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50          /* New P
2edd0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
2ede0 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
2edf0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee10 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2ee20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2ee30 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
2ee40 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2ee50 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2ee60 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2ee70 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f  eturn rc;..    /
2ee80 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
2ee90 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
2eea0 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
2eeb0 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
2eec0 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
2eed0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
2eee0 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
2eef0 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
2ef00 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
2ef10 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
2ef20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
2ef30 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
2ef40 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
2ef50 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
2ef60 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
2ef70 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
2ef80 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
2ef90 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
2efa0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
2efb0 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
2efc0 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
2efd0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
2efe0 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
2eff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2f000 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
2f010 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
2f020 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
2f030 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
2f040 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
2f050 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
2f060 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2f070 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61   = aNew;.    pPa
2f080 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2f090 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20  = nSavepoint;.. 
2f0a0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
2f0b0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
2f0c0 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
2f0d0 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
2f0e0 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
2f0f0 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
2f100 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
2f110 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20   aNew[ii].nOrig 
2f120 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 69  = nPage;.      i
2f130 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2f140 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
2f150 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29  ->journalOff>0 )
2f160 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
2f170 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61  i].iOffset = pPa
2f180 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
2f190 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f1a0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
2f1b0 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c  Offset = JOURNAL
2f1c0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
2f1d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2f1e0 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20  New[ii].iSubRec 
2f1f0 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
2f200 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
2f210 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
2f220 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
2f230 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 20  eate(nPage);.   
2f240 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d     if( !aNew[ii]
2f250 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  .pInSavepoint ){
2f260 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f270 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2f280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2f290 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
2f2a0 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
2f2b0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
2f2c0 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63  pened. */.    rc
2f2d0 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2f2e0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  l(pPager);.    a
2f2f0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
2f300 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
2f310 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2f320 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2f330 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2f340 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
2f350 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  or release (comm
2f360 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e  it) a savepoint.
2f370 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e  .** The savepoin
2f380 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20  t to release or 
2f390 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f  rollback need no
2f3a0 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65  t be the most re
2f3b0 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74  cently .** creat
2f3c0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ed savepoint..**
2f3d0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70  .** Parameter op
2f3e0 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
2f3f0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
2f400 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e  BACK or SAVEPOIN
2f410 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66  T_RELEASE..** If
2f420 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
2f430 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72  _RELEASE, then r
2f440 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72  elease and destr
2f450 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  oy the savepoint
2f460 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69   with.** index i
2f470 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74  Savepoint. If it
2f480 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
2f490 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c  LLBACK, then rol
2f4a0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
2f4b0 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f  s.** that have o
2f4c0 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68  ccurred since th
2f4d0 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
2f4e0 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
2f4f0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76  d..**.** The sav
2f500 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61  epoint to rollba
2f510 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73  ck or release is
2f520 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
2f530 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61  arameter .** iSa
2f540 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65  vepoint. A value
2f550 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f   of 0 means to o
2f560 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75  perate on the ou
2f570 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
2f580 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20  t.** (the first 
2f590 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75  created). A valu
2f5a0 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76  e of (Pager.nSav
2f5b0 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20  epoint-1) means 
2f5c0 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68  operate.** on th
2f5d0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
2f5e0 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
2f5f0 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74  t. If iSavepoint
2f600 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2f610 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65  .** (Pager.nSave
2f620 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74  point-1), then t
2f630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f640 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
2f650 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  f a negative val
2f660 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ue is passed to 
2f670 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
2f680 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
2f690 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
2f6a0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  s rolled back. T
2f6b0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
2f6c0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20   to calling .** 
2f6d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
2f6e0 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20 74  back() because t
2f6f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2f700 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a  s not terminate.
2f710 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
2f720 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  on or unlock the
2f730 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75   database, it ju
2f740 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65 20  st restores the 
2f750 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
2f760 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2f770 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
2f780 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  te. .**.** In an
2f790 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65  y case, all save
2f7a0 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69  points with an i
2f7b0 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
2f7c0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  n iSavepoint .**
2f7d0 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20   are destroyed. 
2f7e0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
2f7f0 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  ease operation (
2f800 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2f810 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20  LEASE),.** then 
2f820 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70  savepoint iSavep
2f830 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73  oint is also des
2f840 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  troyed..**.** Th
2f850 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2f860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f870 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  MEM if a memory 
2f880 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2f890 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72  ,.** or an IO er
2f8a0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49  ror code if an I
2f8b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2f8c0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  hile rolling bac
2f8d0 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  k a .** savepoin
2f8e0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20  t. If no errors 
2f8f0 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
2f900 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2f910 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67   .int sqlite3Pag
2f920 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  erSavepoint(Page
2f930 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f  r *pPager, int o
2f940 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
2f950 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2f960 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2f970 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
2f980 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
2f990 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2f9a0 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  BACK );.  assert
2f9b0 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
2f9c0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
2f9d0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20  _ROLLBACK );..  
2f9e0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70  if( iSavepoint<p
2f9f0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2fa00 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  t ){.    int ii;
2fa10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2fa20 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2fa30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   */.    int nNew
2fa40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
2fa50 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e  mber of remainin
2fa60 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74  g savepoints aft
2fa70 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a  er this op. */..
2fa80 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
2fa90 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70  t how many savep
2faa0 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c  oints will still
2fab0 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
2fac0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65   this.    ** ope
2fad0 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68  ration. Store th
2fae0 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77  is value in nNew
2faf0 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f  . Then free reso
2fb00 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  urces associated
2fb10 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e   .    ** with an
2fb20 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
2fb30 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20  t are destroyed 
2fb40 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
2fb50 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  n..    */.    nN
2fb60 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  ew = iSavepoint 
2fb70 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  + (( op==SAVEPOI
2fb80 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f 20 30  NT_RELEASE ) ? 0
2fb90 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69   : 1);.    for(i
2fba0 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65  i=nNew; ii<pPage
2fbb0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
2fbc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
2fbd0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
2fbe0 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
2fbf0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
2fc00 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
2fc10 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2fc20 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20  int = nNew;..   
2fc30 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2fc40 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20   release of the 
2fc50 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
2fc60 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20  int, truncate . 
2fc70 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
2fc80 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79  urnal to zero by
2fc90 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a  tes in size. */.
2fca0 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
2fcb0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b  POINT_RELEASE ){
2fcc0 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3d  .      if( nNew=
2fcd0 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  =0 && isOpen(pPa
2fce0 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
2fcf0 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72        /* Only tr
2fd00 75 6e 63 61 74 65 20 69 66 20 69 74 20 69 73 20  uncate if it is 
2fd10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62  an in-memory sub
2fd20 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20  -journal. */.   
2fd30 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2fd40 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
2fd50 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
2fd60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2fd70 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
2fd80 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b  Pager->sjfd, 0);
2fd90 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2fda0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2fdb0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
2fdc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53        pPager->nS
2fdd0 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  ubRec = 0;.     
2fde0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20   }.    }.    /* 
2fdf0 45 6c 73 65 20 74 68 69 73 20 69 73 20 61 20 72  Else this is a r
2fe00 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
2fe10 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20  n, playback the 
2fe20 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f  specified savepo
2fe30 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  int..    ** If t
2fe40 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69  his is a temp-fi
2fe50 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  le, it is possib
2fe60 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  le that the jour
2fe70 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20  nal file has.   
2fe80 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e   ** not yet been
2fe90 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
2fea0 20 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65   case there have
2feb0 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   been no changes
2fec0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
2fed0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f  atabase file, so
2fee0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70   the playback op
2fef0 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73  eration can be s
2ff00 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  kipped..    */. 
2ff10 20 20 20 65 6c 73 65 20 69 66 28 20 69 73 4f 70     else if( isOp
2ff20 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2ff30 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53 61  ){.      PagerSa
2ff40 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
2ff50 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f  int = (nNew==0)?
2ff60 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  0:&pPager->aSave
2ff70 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20  point[nNew-1];. 
2ff80 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2ff90 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
2ffa0 28 70 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f  (pPager, pSavepo
2ffb0 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  int);.      asse
2ffc0 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  rt(rc!=SQLITE_DO
2ffd0 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  NE);.    }.  .  
2ffe0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2fff0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
30000 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
30010 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30020 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
30030 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
30040 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
30050 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
30060 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
30070 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
30080 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73  Return the VFS s
30090 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
300a0 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   pager..*/.const
300b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71   sqlite3_vfs *sq
300c0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61  lite3PagerVfs(Pa
300d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
300e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
300f0 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Vfs;.}../*.** Re
30100 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61  turn the file ha
30110 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74  ndle for the dat
30120 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
30130 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
30140 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d  e pager.  This m
30150 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ight return NULL
30160 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   if the file has
30170 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  .** not yet been
30180 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69   opened..*/.sqli
30190 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65  te3_file *sqlite
301a0 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72  3PagerFile(Pager
301b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
301c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  urn pPager->fd;.
301d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
301e0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
301f0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
30200 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
30210 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
30220 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  erJournalname(Pa
30230 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30240 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
30250 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
30260 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
30270 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
30280 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
30290 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
302a0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
302b0 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
302c0 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
302d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
302e0 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20  gerNosync(Pager 
302f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
30300 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  rn pPager->noSyn
30310 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
30320 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
30330 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69  .** Set or retri
30340 65 76 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f  eve the codec fo
30350 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
30360 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
30370 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63  te3PagerSetCodec
30380 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
30390 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
303a0 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
303b0 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
303c0 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
303d0 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
303e0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43  nt),.  void (*xC
303f0 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
30400 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
30410 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  .){.  if( pPager
30420 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
30430 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
30440 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
30450 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  );.  pPager->xCo
30460 64 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65  dec = pPager->me
30470 6d 44 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63  mDb ? 0 : xCodec
30480 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
30490 65 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f  ecSizeChng = xCo
304a0 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70  decSizeChng;.  p
304b0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
304c0 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a  e = xCodecFree;.
304d0 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
304e0 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67   = pCodec;.  pag
304f0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
30500 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ger);.}.static v
30510 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
30520 72 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20  rGetCodec(Pager 
30530 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
30540 72 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  rn pPager->pCode
30550 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c;.}.#endif..#if
30560 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30570 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
30580 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
30590 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
305a0 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
305b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
305c0 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
305d0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
305e0 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
305f0 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
30600 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
30610 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
30620 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
30630 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
30640 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
30650 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
30660 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
30670 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
30680 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
30690 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
306a0 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
306b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
306c0 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
306d0 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
306e0 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
306f0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
30700 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
30710 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
30720 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
30730 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
30740 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
30750 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
30760 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
30770 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
30780 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
30790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
307a0 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
307b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
307c0 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
307d0 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
307e0 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
307f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
30800 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
30810 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
30820 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
30830 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
30840 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
30850 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
30860 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
30870 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
30880 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctive)..**.** If
30890 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
308a0 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  ment, isCommit, 
308b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
308c0 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62  n this page is b
308d0 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73  eing.** moved as
308e0 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62   part of a datab
308f0 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69  ase reorganizati
30900 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  on just before t
30910 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
30920 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  ** is being comm
30930 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  itted. In this c
30940 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61  ase, it is guara
30950 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
30960 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a  atabase page .**
30970 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77   pPg refers to w
30980 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
30990 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68  en to again with
309a0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
309b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
309c0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
309d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
309e0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
309f0 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
30a00 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65  .** occurs. Othe
30a10 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e  rwise, it return
30a20 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
30a30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
30a40 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
30a50 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
30a60 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
30a70 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
30a80 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
30a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30aa0 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
30ab0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
30ac0 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
30ad0 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  gno = 0;       /
30ae0 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70  * Old value of p
30af0 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e  Pg->pgno, if syn
30b00 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f  c is required */
30b10 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
30b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b30 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
30b40 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e  /.  Pgno origPgn
30b50 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
30b60 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   /* The original
30b70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
30b80 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
30b90 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  nRef>0 );..  /* 
30ba0 49 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61  In order to be a
30bb0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
30bc0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
30bd0 74 61 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72  tabase must jour
30be0 6e 61 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  nal.  ** the pag
30bf0 65 20 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20  e we are moving 
30c00 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
30c10 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63   MEMDB ){.    rc
30c20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30c30 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69  rite(pPg);.    i
30c40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30c50 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
30c60 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d  the page being m
30c70 6f 76 65 64 20 69 73 20 64 69 72 74 79 20 61 6e  oved is dirty an
30c80 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73  d has not been s
30c90 61 76 65 64 20 62 79 20 74 68 65 20 6c 61 74 65  aved by the late
30ca0 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e  st.  ** savepoin
30cb0 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68 65  t, then save the
30cc0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
30cd0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
30ce0 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62  to the .  ** sub
30cf0 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68  -journal now. Th
30d00 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 74  is is required t
30d10 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c  o handle the fol
30d20 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a  lowing scenario:
30d30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47  .  **.  **   BEG
30d40 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  IN;.  **     <jo
30d50 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68  urnal page X, th
30d60 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20  en modify it in 
30d70 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20  memory>.  **    
30d80 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
30d90 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65    **       <Move
30da0 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74   page X to locat
30db0 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20  ion Y>.  **     
30dc0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
30dd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61  .  **.  ** If pa
30de0 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72  ge X were not wr
30df0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
30e00 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69  -journal here, i
30e10 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a  t would not.  **
30e20 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
30e30 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74  restore its cont
30e40 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22 52  ents when the "R
30e50 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a  OLLBACK TO one".
30e60 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
30e70 65 72 65 20 69 73 20 70 72 6f 63 65 73 73 65 64  ere is processed
30e80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a  ..  **.  ** subj
30e90 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79  ournalPage() may
30ea0 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   need to allocat
30eb0 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65  e space to store
30ec0 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a   pPg->pgno into.
30ed0 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    ** one or more
30ee0 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65   savepoint bitve
30ef0 63 73 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  cs. This is the 
30f00 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63  reason this func
30f10 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65  tion.  ** may re
30f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
30f30 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  M..  */.  if( pP
30f40 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
30f50 49 52 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52  IRTY.   && subjR
30f60 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
30f70 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  .   && SQLITE_OK
30f80 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e  !=(rc = subjourn
30f90 61 6c 50 61 67 65 28 70 50 67 29 29 0a 20 20 29  alPage(pPg)).  )
30fa0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
30fb0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
30fc0 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE(("MOVE %d pag
30fd0 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
30fe0 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
30ff0 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
31000 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
31010 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67  pgno, (pPg->flag
31020 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
31030 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a  C)?1:0, pgno));.
31040 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
31050 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
31060 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
31070 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66   pgno))..  /* If
31080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
31090 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
310a0 64 20 62 65 66 6f 72 65 20 70 61 67 65 20 70 50  d before page pP
310b0 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a  g->pgno can.  **
310c0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20   be written to, 
310d0 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20  store pPg->pgno 
310e0 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
310f0 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
31100 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
31110 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
31120 73 20 73 65 74 2c 20 74 68 65 72 65 20 69 73 20  s set, there is 
31130 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
31140 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ber that.  ** th
31150 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
31160 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
31170 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
31180 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20  age pPg->pgno . 
31190 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74   ** can be writt
311a0 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
311b0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
311c0 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
311d0 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a  ite to it..  */.
311e0 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
311f0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
31200 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20  C) && !isCommit 
31210 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
31220 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
31230 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
31240 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
31250 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
31260 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
31270 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
31280 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
31290 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73  DIRTY );.    ass
312a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
312b0 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
312c0 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
312d0 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
312e0 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
312f0 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
31300 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68  .  ** from its h
31310 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
31320 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
31330 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
31340 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
31350 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
31360 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
31370 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
31380 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
31390 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
313a0 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
313b0 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
313c0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
313d0 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
313e0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
313f0 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
31400 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c  !pPgOld || pPgOl
31410 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20  d->nRef==1 );.  
31420 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
31430 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
31440 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50  (pPgOld->flags&P
31450 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b  GHDR_NEED_SYNC);
31460 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
31470 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
31480 74 20 64 69 73 63 61 72 64 20 70 61 67 65 73 20  t discard pages 
31490 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  from an in-memor
314a0 79 20 64 61 74 61 62 61 73 65 20 73 69 6e 63 65  y database since
314b0 20 77 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20   we might.      
314c0 2a 2a 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  ** need to rollb
314d0 61 63 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74  ack later.  Just
314e0 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f   move the page o
314f0 75 74 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a  ut of the way. *
31500 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
31510 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
31520 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  lid );.      sql
31530 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
31540 50 67 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64  PgOld, pPager->d
31550 62 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65  bSize+1);.    }e
31560 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
31570 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
31580 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Old);.    }.  }.
31590 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50  .  origPgno = pP
315a0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74  g->pgno;.  sqlit
315b0 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
315c0 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74  , pgno);.  sqlit
315d0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
315e0 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
315f0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
31600 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
31610 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
31620 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
31630 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
31640 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
31650 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
31660 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
31670 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
31680 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
31690 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
316a0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
316b0 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
316c0 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
316d0 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
316e0 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
316f0 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e      ** "is journ
31700 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61  aled" bitvec fla
31710 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  g has been set. 
31720 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
31730 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20   remedied by.   
31740 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   ** loading the 
31750 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
31760 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
31770 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
31780 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
31790 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
317a0 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65    ** If the atte
317b0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  mpt to load the 
317c0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
317d0 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20  ge-cache fails, 
317e0 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61  (due.    ** to a
317f0 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
31800 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20  failure), clear 
31810 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70  the bit in the p
31820 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20  InJournal[].    
31830 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  ** array. Otherw
31840 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65  ise, if the page
31850 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77   is loaded and w
31860 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a  ritten again in.
31870 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e      ** this tran
31880 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20  saction, it may 
31890 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
318a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
318b0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74  before.    ** it
318c0 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20   is synced into 
318d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
318e0 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d  . This way, it m
318f0 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20  ay end up in.   
31900 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
31910 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20  file twice, but 
31920 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
31930 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20  oblem..    **.  
31940 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
31950 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
31960 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
31970 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
31980 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
31990 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
319a0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
319b0 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
319c0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
319d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
319e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
319f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31a00 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
31a10 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
31a20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
31a30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31a40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
31a50 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
31a60 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
31a70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31a80 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
31a90 63 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ce!=0 );.       
31aa0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c   sqlite3BitvecCl
31ab0 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ear(pPager->pInJ
31ac0 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63  ournal, needSync
31ad0 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54  Pgno, pPager->pT
31ae0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
31af0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
31b00 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
31b10 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
31b20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
31b30 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
31b40 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
31b50 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20    pPgHdr->flags 
31b60 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
31b70 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  NC;.    sqlite3P
31b80 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
31b90 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
31ba0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
31bb0 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  gHdr);.  }..  /*
31bc0 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  .  ** For an in-
31bd0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
31be0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   make sure the o
31bf0 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
31c00 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65  tinues.  ** to e
31c10 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68  xist, in case th
31c20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  e transaction ne
31c30 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  eds to roll back
31c40 2e 20 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20  .  Use pPgOld.  
31c50 2a 2a 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  ** as the origin
31c60 61 6c 20 70 61 67 65 20 73 69 6e 63 65 20 69 74  al page since it
31c70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
31c80 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a  n allocated..  *
31c90 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
31ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
31cb0 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f  heMove(pPgOld, o
31cc0 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71  rigPgno);.    sq
31cd0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
31ce0 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pPgOld);.  }..  
31cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31d00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
31d10 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
31d20 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
31d30 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
31d40 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
31d50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
31d60 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
31d70 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
31d80 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e  >nRef>0 || pPg->
31d90 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b  pPager->memDb );
31da0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
31db0 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Data;.}../*.** R
31dc0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
31dd0 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
31de0 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
31df0 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
31e00 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
31e10 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
31e20 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
31e30 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
31e40 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
31e50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
31e60 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a  ->pExtra;.}../*.
31e70 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
31e80 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
31e90 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
31ea0 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
31eb0 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
31ec0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31ed0 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
31ee0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
31ef0 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
31f00 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
31f10 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
31f20 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
31f30 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
31f40 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
31f50 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
31f60 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
31f70 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
31f80 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
31f90 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31fa0 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
31fb0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31fc0 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
31fd0 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
31fe0 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
31ff0 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
32000 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
32010 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
32020 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
32030 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
32040 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
32050 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
32060 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
32070 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
32080 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
32090 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
320a0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
320b0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
320c0 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
320d0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
320e0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
320f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
32100 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
32110 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
32120 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
32130 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
32140 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
32150 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
32160 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
32170 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
32180 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
32190 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
321a0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
321b0 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
321c0 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  et/set the journ
321d0 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
321e0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
321f0 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
32200 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
32210 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
32220 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50  DE_QUERY.**    P
32230 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32240 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41  _DELETE.**    PA
32250 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32260 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50  TRUNCATE.**    P
32270 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32280 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50  _PERSIST.**    P
32290 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
322a0 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52  _OFF.**    PAGER
322b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
322c0 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ORY.**.** If the
322d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
322e0 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74  t _QUERY, then t
322f0 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  he journal_mode 
32300 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a  is set to the.**
32310 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
32320 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69   if the change i
32330 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20  s allowed.  The 
32340 63 68 61 6e 67 65 20 69 73 20 64 69 73 61 6c 6c  change is disall
32350 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  owed.** for the 
32360 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e  following reason
32370 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  s:.**.**   *  An
32380 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
32390 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76  ase can only hav
323a0 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  e its journal_mo
323b0 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a  de set to _OFF.*
323c0 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52  *      or _MEMOR
323d0 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68  Y..**.**   *  Th
323e0 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d  e journal mode m
323f0 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ay not be change
32400 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73 61  d while a transa
32410 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
32420 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
32430 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65  ned indicate the
32440 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
32450 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72  ly updated) jour
32460 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  nal-mode..*/.int
32470 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
32480 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a  rnalMode(Pager *
32490 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
324a0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
324b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
324c0 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  ALMODE_QUERY.   
324d0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
324e0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
324f0 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
32500 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
32510 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32520 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20  ODE_TRUNCATE.   
32530 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32540 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32550 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
32560 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32570 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32580 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
32590 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
325a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
325b0 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73  E_MEMORY );.  as
325c0 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
325d0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
325e0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
325f0 30 0a 20 20 20 26 26 20 28 21 4d 45 4d 44 42 20  0.   && (!MEMDB 
32600 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
32610 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
32620 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  RY .            
32630 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
32640 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
32650 46 29 0a 20 20 20 26 26 20 21 70 50 61 67 65 72  F).   && !pPager
32660 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20 20  ->dbModified.   
32670 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61 67  && (!isOpen(pPag
32680 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70  er->jfd) || 0==p
32690 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
326a0 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  f).  ){.    if( 
326b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
326c0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  fd) ){.      sql
326d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
326e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
326f0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
32700 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
32710 52 55 4e 43 41 54 45 20 26 20 31 29 3d 3d 31 20  RUNCATE & 1)==1 
32720 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
32730 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32740 45 5f 50 45 52 53 49 53 54 20 26 20 31 29 3d 3d  E_PERSIST & 1)==
32750 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
32760 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
32770 4f 44 45 5f 44 45 4c 45 54 45 20 26 20 31 29 3d  ODE_DELETE & 1)=
32780 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
32790 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
327a0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20 31 29  MODE_MEMORY & 1)
327b0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
327c0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
327d0 4c 4d 4f 44 45 5f 4f 46 46 20 26 20 31 29 3d 3d  LMODE_OFF & 1)==
327e0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50  0 );.    if( (pP
327f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
32800 65 20 26 20 31 29 3d 3d 31 20 26 26 20 28 65 4d  e & 1)==1 && (eM
32810 6f 64 65 20 26 20 31 29 3d 3d 30 0a 20 20 20 20  ode & 1)==0.    
32820 20 20 20 20 20 26 26 20 21 70 50 61 67 65 72 2d       && !pPager-
32830 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
32840 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
32850 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
32860 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32870 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
32880 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  }.    pPager->jo
32890 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29  urnalMode = (u8)
328a0 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
328b0 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
328c0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a  >journalMode;.}.
328d0 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
328e0 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73  he size-limit us
328f0 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ed for persisten
32900 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  t journal files.
32910 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74  .**.** Setting t
32920 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f  he size limit to
32930 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d   -1 means no lim
32940 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a  it is enforced..
32950 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f  ** An attempt to
32960 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61   set a limit sma
32970 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20  ller than -1 is 
32980 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20  a no-op..*/.i64 
32990 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
329a0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67  nalSizeLimit(Pag
329b0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20  er *pPager, i64 
329c0 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69  iLimit){.  if( i
329d0 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20  Limit>=-1 ){.   
329e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
329f0 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  SizeLimit = iLim
32a00 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
32a10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
32a20 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a  SizeLimit;.}../*
32a30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
32a40 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67  nter to the pPag
32a50 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69  er->pBackup vari
32a60 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70  able. The backup
32a70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61   module.** in ba
32a80 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73  ckup.c maintains
32a90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
32aa0 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54  this variable. T
32ab0 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73  his module.** us
32ac0 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61  es it opaquely a
32ad0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
32ae0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
32af0 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73  start() and.** s
32b00 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
32b10 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71  te() only..*/.sq
32b20 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73  lite3_backup **s
32b30 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75  qlite3PagerBacku
32b40 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67  pPtr(Pager *pPag
32b50 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70  er){.  return &p
32b60 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a  Pager->pBackup;.
32b70 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
32b80 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
32b90 2a 2f 0a                                         */.