/ Hex Artifact Content
Login

Artifact 01e3facb2f7c5f307e36a0f4ed9343cf3761711a:


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 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 37  : pager.c,v 1.57
0350: 31 20 32 30 30 39 2f 30 33 2f 30 35 20 30 34 3a  1 2009/03/05 04:
0360: 32 30 3a 33 32 20 73 68 61 6e 65 20 45 78 70 20  20:32 shane Exp 
0370: 24 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  $.*/.#ifndef SQL
0380: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0390: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
03a0: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61  Int.h"../*.** Ma
03b0: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
03c0: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
03d0: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
03e0: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
03f0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
0400: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0410: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0420: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
0430: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
0440: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
0450: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
0460: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
0470: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
0480: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
0490: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
04a0: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
04b0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
04c0: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
04d0: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
04e0: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
04f0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
0500: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
0510: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
0520: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
0530: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
0540: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
0550: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
0560: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0570: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
0580: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
0590: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
05a0: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
05b0: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
05c0: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
05d0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
05e0: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
05f0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
0600: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
0610: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
0620: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0630: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0640: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0660: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0670: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0680: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0690: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
06a0: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
06b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
06c0: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
06d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06e0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
06f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0700: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
0710: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
0720: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
0730: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0750: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0760: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0770: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0780: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0790: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
07c0: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
07d0: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
0800: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
0810: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
0820: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0830: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0840: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0850: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0860: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0870: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0880: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0890: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
08c0: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
08d0: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
08e0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
0910: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
0920: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
0930: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0950: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0960: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0970: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
09a0: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
09b0: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
09c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
09d0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
09e0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
09f0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0a00: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0a10: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
0a20: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0a50: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0a60: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0a70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a80: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0a90: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0aa0: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0ab0: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ad0: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0ae0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0af0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0b00: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0b10: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0b20: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0b30: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0b40: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0b50: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0b60: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0b70: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0ba0: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0bb0: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0bc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bd0: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0be0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0bf0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0c00: 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ove or.**       
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
0c30: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68  rnal file and th
0c40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
0c50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c60: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20          will be 
0c70: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0c80: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0c90: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0ca0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0cb0: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0cc0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
0cd0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61   occurs, the sta
0ce0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0cf0: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
0d00: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
0d10: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
0d20: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0d30: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0d40: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0d50: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0d60: 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  o PAGER_UNLOCK. 
0d70: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   The first time.
0d80: 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 50  ** that sqlite3P
0d90: 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
0da0: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0db0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0dc0: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0dd0: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0de0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
0df0: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0e00: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0e10: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0e20: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0e30: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0e40: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0e50: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0e60: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e70: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0e80: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0e90: 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  D means that the
0ea0: 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f  re is an open ro
0eb0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
0ec0: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0ed0: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0ee0: 53 49 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f  SIVE occurs befo
0ef0: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a  re any changes.*
0f00: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  * are made to th
0f10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
0f20: 20 74 68 6f 75 67 68 20 77 72 69 74 65 73 20 74   though writes t
0f30: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
0f40: 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73  * journal occurs
0f50: 20 77 69 74 68 20 6a 75 73 74 20 50 41 47 45 52   with just PAGER
0f60: 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66 74 65  _RESERVED.  Afte
0f70: 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  r an sqlite3Page
0f80: 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f  rRollback().** o
0f90: 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  r sqlite3PagerCo
0fa0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20  mmitPhaseTwo(), 
0fb0: 74 68 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f  the state can go
0fc0: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
0fd0: 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20  HARED,.** or it 
0fe0: 63 61 6e 20 73 74 61 79 20 61 74 20 50 41 47 45  can stay at PAGE
0ff0: 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66 20 77  R_EXCLUSIVE if w
1000: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
1010: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
1020: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1030: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1040: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1050: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1060: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1070: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1080: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
1090: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
10a0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
10b0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
10c0: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
10d0: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10e0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
10f0: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
1100: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 54        5../*.** T
1110: 68 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73  his macro rounds
1120: 20 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68   values up so th
1130: 61 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  at if the value 
1140: 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74  is an address it
1150: 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65  .** is guarantee
1160: 64 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65  d to be an addre
1170: 73 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e  ss that is align
1180: 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20  ed to an 8-byte 
1190: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65  boundary..*/.#de
11a0: 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e  fine FORCE_ALIGN
11b0: 4d 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b  MENT(X)   (((X)+
11c0: 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  7)&~7)../*.** A 
11d0: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
11e0: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
11f0: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
1200: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
1210: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
1220: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
1230: 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f  ,N,X) if( P->xCo
1240: 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f  dec!=0 ){ P->xCo
1250: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
1260: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66  ,D,N,X); }.# def
1270: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
1280: 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e  ,X) ((char*)(P->
1290: 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f  xCodec!=0?P->xCo
12a0: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
12b0: 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73  ,D,N,X):D)).#els
12c0: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
12d0: 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f  1(P,D,N,X) /* NO
12e0: 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  -OP */.# define 
12f0: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
1300: 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69  ((char*)D).#endi
1310: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
1320: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63  imum allowed sec
1330: 74 6f 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20  tor size. 16MB. 
1340: 49 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69  If the xSectorsi
1350: 7a 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20  ze() method .** 
1360: 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20  returns a value 
1370: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
1380: 2c 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f  , then MAX_SECTO
1390: 52 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69  R_SIZE is used i
13a0: 6e 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20  nstead..** This 
13b0: 63 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c  could conceivabl
13c0: 79 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69  y cause corrupti
13d0: 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70  on following a p
13e0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a  ower failure on.
13f0: 2a 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d  ** such a system
1400: 2e 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e  . This is curren
1410: 74 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e  tly an undocumen
1420: 74 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64  ted limit..*/.#d
1430: 65 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52  efine MAX_SECTOR
1440: 5f 53 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a  _SIZE 0x0100000.
1450: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
1460: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1470: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
1480: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
1490: 61 63 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61  ach active.** sa
14a0: 76 65 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74  vepoint and stat
14b0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14c0: 6e 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e  n in the system.
14d0: 20 41 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74   All such struct
14e0: 75 72 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ures.** are stor
14f0: 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
1500: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
1510: 61 79 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c  ay, which is all
1520: 6f 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65  ocated and.** re
1530: 73 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69  sized using sqli
1540: 74 65 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3Realloc()..**
1550: 0a 2a 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70  .** When a savep
1560: 6f 69 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c  oint is created,
1570: 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
1580: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
1590: 69 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74  ield is.** set t
15a0: 6f 20 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61  o 0. If a journa
15b0: 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l-header is writ
15c0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ten into the mai
15d0: 6e 20 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a  n journal while.
15e0: 2a 2a 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  ** the savepoint
15f0: 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e   is active, then
1600: 20 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 73   iHdrOffset is s
1610: 65 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f  et to the byte o
1620: 66 66 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69  ffset .** immedi
1630: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1640: 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
1650: 20 72 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20   record written 
1660: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  into the main.**
1670: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
1680: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
1690: 65 72 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  er. This is requ
16a0: 69 72 65 64 20 64 75 72 69 6e 67 20 73 61 76 65  ired during save
16b0: 70 6f 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63  point.** rollbac
16c0: 6b 20 28 73 65 65 20 70 61 67 65 72 50 6c 61 79  k (see pagerPlay
16d0: 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29  backSavepoint())
16e0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
16f0: 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  uct PagerSavepoi
1700: 6e 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  nt PagerSavepoin
1710: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 53  t;.struct PagerS
1720: 61 76 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34  avepoint {.  i64
1730: 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20   iOffset;       
1740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
1750: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20  rting offset in 
1760: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
1770: 20 20 69 36 34 20 69 48 64 72 4f 66 66 73 65 74    i64 iHdrOffset
1780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1790: 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20  * See above */. 
17a0: 20 42 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65   Bitvec *pInSave
17b0: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  point;        /*
17c0: 20 53 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e   Set of pages in
17d0: 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20   this savepoint 
17e0: 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  */.  Pgno nOrig;
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75    /* Original nu
1810: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1820: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1830: 69 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  iSubRec;        
1840: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1850: 20 6f 66 20 66 69 72 73 74 20 72 65 63 6f 72 64   of first record
1860: 20 69 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   in sub-journal 
1870: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  */.};../*.** A o
1880: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
1890: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
18a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
18b0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
18c0: 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20  errCode.**.**   
18d0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61  Pager.errCode ma
18e0: 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  y be set to SQLI
18f0: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
1900: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20  _CORRUPT, or.** 
1910: 20 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c    or SQLITE_FULL
1920: 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68  . Once one of th
1930: 65 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72  e first three er
1940: 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20  rors occurs, it 
1950: 70 65 72 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e  persists.**   an
1960: 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  d is returned as
1970: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65   the result of e
1980: 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72  very major pager
1990: 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a   API call.  The.
19a0: 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c  **   SQLITE_FULL
19b0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
19c0: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
19d0: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
19e0: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
19f0: 2a 20 20 20 6e 65 78 74 20 73 75 63 63 65 73 73  *   next success
1a00: 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  ful rollback is 
1a10: 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
1a20: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c   pager cache. Al
1a30: 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  so,.**   SQLITE_
1a40: 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66  FULL does not af
1a50: 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  fect the sqlite3
1a60: 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73  PagerGet() and s
1a70: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1a80: 70 28 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74  p().**   APIs, t
1a90: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
1aa0: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
1ab0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65  ly..**.** dbSize
1ac0: 56 61 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20 64  Valid, dbSize, d
1ad0: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
1ae0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61  eSize.**.**   Ma
1af0: 6e 61 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20  naging the size 
1b00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1b10: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73  file in pages is
1b20: 20 61 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69   a little compli
1b30: 63 61 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20  cated..**   The 
1b40: 76 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64  variable Pager.d
1b50: 62 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  bSize contains t
1b60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1b70: 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61  es that the data
1b80: 62 61 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20  base.**   image 
1b90: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
1ba0: 6e 73 2e 20 41 73 20 74 68 65 20 64 61 74 61 62  ns. As the datab
1bb0: 61 73 65 20 69 6d 61 67 65 20 67 72 6f 77 73 20  ase image grows 
1bc0: 6f 72 20 73 68 72 69 6e 6b 73 20 74 68 69 73 0a  or shrinks this.
1bd0: 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 69 73  **   variable is
1be0: 20 75 70 64 61 74 65 64 2e 20 54 68 65 20 76 61   updated. The va
1bf0: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46  riable Pager.dbF
1c00: 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73  ileSize contains
1c10: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20   the number.**  
1c20: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1c30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1c40: 54 68 69 73 20 6d 61 79 20 62 65 20 64 69 66 66  This may be diff
1c50: 65 72 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72  erent from Pager
1c60: 2e 64 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20  .dbSize.**   if 
1c70: 73 6f 6d 65 20 70 61 67 65 73 20 68 61 76 65 20  some pages have 
1c80: 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f  been appended to
1c90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1ca0: 61 67 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20  age but not yet 
1cb0: 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74  written.**   out
1cc0: 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
1cd0: 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  to the actual fi
1ce0: 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69  le on disk. Or i
1cf0: 66 20 74 68 65 20 69 6d 61 67 65 20 68 61 73 20  f the image has 
1d00: 62 65 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61  been.**   trunca
1d10: 74 65 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d  ted by an increm
1d20: 65 6e 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65  ental-vacuum ope
1d30: 72 61 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65  ration. The Page
1d40: 72 2e 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72  r.dbOrigSize var
1d50: 69 61 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61  iable.**   conta
1d60: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
1d70: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1d80: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 68  atabase image wh
1d90: 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
1da0: 2a 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  *   transaction 
1db0: 77 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20  was opened. The 
1dc0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20  contents of all 
1dd0: 74 68 72 65 65 20 6f 66 20 74 68 65 73 65 20 76  three of these v
1de0: 61 72 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20  ariables is.**  
1df0: 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64   only guaranteed
1e00: 20 74 6f 20 62 65 20 63 6f 72 72 65 63 74 20 69   to be correct i
1e10: 66 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61  f the boolean Pa
1e20: 67 65 72 2e 64 62 53 69 7a 65 56 61 6c 69 64 20  ger.dbSizeValid 
1e30: 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  is true..**.**  
1e40: 20 54 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68 61   TODO: Under wha
1e50: 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20  t conditions is 
1e60: 64 62 53 69 7a 65 56 61 6c 69 64 20 73 65 74 3f  dbSizeValid set?
1e70: 20 43 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20   Cleared?.**.** 
1e80: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a  changeCountDone.
1e90: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f  **.**   This boo
1ea0: 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73  lean variable is
1eb0: 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
1ec0: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  re that the chan
1ed0: 67 65 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20  ge-counter .**  
1ee0: 20 28 74 68 65 20 34 2d 62 79 74 65 20 68 65 61   (the 4-byte hea
1ef0: 64 65 72 20 66 69 65 6c 64 20 61 74 20 62 79 74  der field at byt
1f00: 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
1f10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f20: 29 20 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75  ) is .**   not u
1f30: 70 64 61 74 65 64 20 6d 6f 72 65 20 6f 66 74 65  pdated more ofte
1f40: 6e 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  n than necessary
1f50: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73  . .**.**   It is
1f60: 20 73 65 74 20 74 6f 20 74 72 75 65 20 77 68 65   set to true whe
1f70: 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1f80: 6e 74 65 72 20 66 69 65 6c 64 20 69 73 20 75 70  nter field is up
1f90: 64 61 74 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a  dated, which .**
1fa0: 20 20 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70     can only happ
1fb0: 65 6e 20 69 66 20 61 6e 20 65 78 63 6c 75 73 69  en if an exclusi
1fc0: 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ve lock is held 
1fd0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fe0: 66 69 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73  file..**   It is
1ff0: 20 63 6c 65 61 72 65 64 20 28 73 65 74 20 74 6f   cleared (set to
2000: 20 66 61 6c 73 65 29 20 77 68 65 6e 65 76 65 72   false) whenever
2010: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
2020: 63 6b 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69  ck is .**   reli
2030: 6e 71 75 69 73 68 65 64 20 6f 6e 20 74 68 65 20  nquished on the 
2040: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 45  database file. E
2050: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
2060: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
2070: 74 65 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68  ted,.**   The ch
2080: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
2090: 61 67 20 69 73 20 69 6e 73 70 65 63 74 65 64 2e  ag is inspected.
20a0: 20 49 66 20 69 74 20 69 73 20 74 72 75 65 2c 20   If it is true, 
20b0: 74 68 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20  the work of.**  
20c0: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 63 68   updating the ch
20d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20  ange-counter is 
20e0: 6f 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 20  omitted for the 
20f0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
2100: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  ion..**.**   Thi
2110: 73 20 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e  s mechanism mean
2120: 73 20 74 68 61 74 20 77 68 65 6e 20 72 75 6e 6e  s that when runn
2130: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
2140: 20 6d 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74   mode, a connect
2150: 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f  ion .**   need o
2160: 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 63  nly update the c
2170: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e  hange-counter on
2180: 63 65 2c 20 66 6f 72 20 74 68 65 20 66 69 72 73  ce, for the firs
2190: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  t transaction.**
21a0: 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a     committed..**
21b0: 0a 2a 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a  .** dbModified.*
21c0: 2a 0a 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f 64  *.**   The dbMod
21d0: 69 66 69 65 64 20 66 6c 61 67 20 69 73 20 73 65  ified flag is se
21e0: 74 20 77 68 65 6e 65 76 65 72 20 61 20 64 61 74  t whenever a dat
21f0: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 64 69  abase page is di
2200: 72 74 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69  rtied..**   It i
2210: 73 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 65  s cleared at the
2220: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 74 72 61   end of each tra
2230: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2240: 20 20 49 74 20 69 73 20 75 73 65 64 20 77 68 65    It is used whe
2250: 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20  n committing or 
2260: 6f 74 68 65 72 77 69 73 65 20 65 6e 64 69 6e 67  otherwise ending
2270: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
2280: 49 66 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f  If.**   the dbMo
2290: 64 69 66 69 65 64 20 66 6c 61 67 20 69 73 20 63  dified flag is c
22a0: 6c 65 61 72 20 74 68 65 6e 20 6c 65 73 73 20 77  lear then less w
22b0: 6f 72 6b 20 68 61 73 20 74 6f 20 62 65 20 64 6f  ork has to be do
22c0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61  ne..**.** journa
22d0: 6c 53 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20  lStarted.**.**  
22e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
22f0: 74 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 74  t whenever the t
2300: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2310: 69 73 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a  is synced. .**.*
2320: 2a 20 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66  *   The point of
2330: 20 74 68 69 73 20 66 6c 61 67 20 69 73 20 74 68   this flag is th
2340: 61 74 20 69 74 20 6d 75 73 74 20 62 65 20 73 65  at it must be se
2350: 74 20 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20  t after the .** 
2360: 20 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20    first journal 
2370: 68 65 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72  header in a jour
2380: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
2390: 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
23a0: 2e 0a 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69  ..**   After thi
23b0: 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
23c0: 6e 65 77 20 70 61 67 65 73 20 61 70 70 65 6e 64  new pages append
23d0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
23e0: 73 65 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20  se .**   do not 
23f0: 6e 65 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e  need the PGHDR_N
2400: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65  EED_SYNC flag se
2410: 74 2c 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f  t, as they do no
2420: 74 20 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77  t need.**   to w
2430: 61 69 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61  ait for a journa
2440: 6c 20 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68  l sync before th
2450: 65 79 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ey can be writte
2460: 6e 20 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68  n out to.**   th
2470: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2480: 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61  (see function pa
2490: 67 65 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a  ger_write())..**
24a0: 20 20 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72     .** setMaster
24b0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61  .**.**   This va
24c0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
24d0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
24e0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
24f0: 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20   file name.**   
2500: 28 69 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79  (if any) is only
2510: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
2520: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2530: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  nce..**.**   Whe
2540: 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
2550: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
2560: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2570: 69 6c 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79  ile name (if any
2580: 29 0a 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72  ).**   may be wr
2590: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
25a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c  ournal file whil
25b0: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73  e the pager is s
25c0: 74 69 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47  till in.**   PAG
25d0: 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
25e0: 65 20 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61  e (see CommitPha
25f0: 73 65 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20  seOne() for the 
2600: 61 63 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20  action). It.**  
2610: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74   then attempts t
2620: 6f 20 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20  o upgrade to an 
2630: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
2640: 49 66 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a  If this attempt.
2650: 2a 2a 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e  **   fails, then
2660: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79   SQLITE_BUSY may
2670: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
2680: 74 68 65 20 75 73 65 72 20 61 6e 64 20 74 68 65  the user and the
2690: 20 75 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61   user.**   may a
26a0: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74  ttempt to commit
26b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
26c0: 20 61 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61   again later (ca
26d0: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69  lling.**   Commi
26e0: 74 50 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69  tPhaseOne() agai
26f0: 6e 29 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73  n). This flag is
2700: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
2710: 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d  that the .**   m
2720: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
2730: 6d 65 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74  me is only writt
2740: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2750: 6c 20 66 69 6c 65 20 74 68 65 20 66 69 72 73 74  l file the first
2760: 0a 2a 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69  .**   time Commi
2770: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
2780: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e  alled..**.** doN
2790: 6f 74 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54  otSync.**.**   T
27a0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
27b0: 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20  set and cleared 
27c0: 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  by sqlite3PagerW
27d0: 72 69 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65  rite()..**.** ne
27e0: 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54  edSync.**.**   T
27f0: 4f 44 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65  ODO: It might be
2800: 20 65 61 73 69 65 72 20 74 6f 20 73 65 74 20 74   easier to set t
2810: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20  his variable in 
2820: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
2830: 29 0a 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65  ).**   and write
2840: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
2850: 6f 6e 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73  only. Change its
2860: 20 6d 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73   meaning to "uns
2870: 79 6e 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20  ynced data.**   
2880: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2890: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22   to the journal"
28a0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
28b0: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
28c0: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
28d0: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
28e0: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
28f0: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
2900: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
2910: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
2920: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
2930: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
2940: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
2950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2960: 20 4f 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52   On of the PAGER
2970: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
2980: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
2990: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
29a0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
29b0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
29c0: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
29d0: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
29e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29f0: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
2a00: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
2a10: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  cks */.  u8 noSy
2a20: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2a30: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
2a40: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2a50: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
2a60: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
2a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
2a80: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
2a90: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
2aa0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
2ab0: 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20   sync_flags;    
2ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2ad0: 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   of SYNC_NORMAL 
2ae0: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a  or SYNC_FULL */.
2af0: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b10: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
2b20: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
2b30: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
2b60: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
2b70: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
2ba0: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
2bb0: 4f 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66  O */..  /* The f
2bc0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63  ollowing block c
2bd0: 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c  ontains those cl
2be0: 61 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ass members that
2bf0: 20 61 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79   are dynamically
2c00: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64  .  ** modified d
2c10: 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65  uring normal ope
2c20: 72 61 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68  rations. The oth
2c30: 65 72 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  er variables in 
2c40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 0a 20  this structure. 
2c50: 20 2a 2a 20 61 72 65 20 65 69 74 68 65 72 20 63   ** are either c
2c60: 6f 6e 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f  onstant througho
2c70: 75 74 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ut the lifetime 
2c80: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72  of the pager, or
2c90: 20 65 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20   else.  ** used 
2ca0: 74 6f 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75  to store configu
2cb0: 72 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  ration parameter
2cc0: 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
2cd0: 65 20 77 61 79 20 74 68 65 20 70 61 67 65 72 20  e way the pager 
2ce0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a  .  ** operates..
2cf0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73    **.  ** The 's
2d00: 74 61 74 65 27 20 76 61 72 69 61 62 6c 65 20 69  tate' variable i
2d10: 73 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d  s described in m
2d20: 6f 72 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67  ore detail along
2d30: 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64   with the.  ** d
2d40: 65 73 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74  escriptions of t
2d50: 68 65 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79  he values it may
2d60: 20 74 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e   take - PAGER_UN
2d70: 4c 4f 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f  LOCK etc. Many o
2d80: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  f the.  ** other
2d90: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
2da0: 69 73 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73  is block are des
2db0: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f  cribed in the co
2dc0: 6d 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a  mment directly .
2dd0: 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20    ** above this 
2de0: 63 6c 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e  class definition
2df0: 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  ..  */.  u8 stat
2e00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2e10: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e       /* PAGER_UN
2e20: 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f  LOCK, _SHARED, _
2e30: 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a  RESERVED, etc. *
2e40: 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65  /.  u8 dbModifie
2e50: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2e60: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
2e70: 20 61 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73   are any changes
2e80: 20 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20   to the Db */.  
2e90: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2eb0: 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28  rue if an fsync(
2ec0: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74  ) is needed on t
2ed0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2ee0: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
2ef0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
2f00: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
2f10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
2f20: 65 64 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67  ed */.  u8 chang
2f30: 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20  eCountDone;     
2f40: 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72      /* Set after
2f50: 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
2f60: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f70: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2f80: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2f90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
2fa0: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
2fb0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
2fc0: 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79   */.  u8 doNotSy
2fd0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2fe0: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68    /* Boolean. Wh
2ff0: 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74  ile true, do not
3000: 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
3010: 20 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56   */.  u8 dbSizeV
3020: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
3030: 20 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62    /* Set when db
3040: 53 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20  Size is correct 
3050: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65  */.  Pgno dbSize
3060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3070: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
3080: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
3090: 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ase */.  Pgno db
30a0: 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20  OrigSize;       
30b0: 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62       /* dbSize b
30c0: 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
30d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  t transaction */
30e0: 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69  .  Pgno dbFileSi
30f0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
3100: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
3110: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
3120: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
3130: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
3140: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3150: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
3160: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
3170: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
3180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
3190: 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73  ges journalled s
31a0: 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64  ince last j-head
31b0: 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  er written */.  
31c0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
31e0: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
31f0: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
3200: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75   checksum */.  u
3210: 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20  32 nSubRec;     
3220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3230: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
3240: 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a  written to sub-j
3250: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76  ournal */.  Bitv
3260: 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20  ec *pInJournal; 
3270: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
3280: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
3290: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
32a0: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
32b0: 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20  e3_file *fd;    
32c0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
32d0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61  escriptor for da
32e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
32f0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
3300: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3310: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d  descriptor for m
3320: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
3330: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
3340: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  jfd;         /* 
3350: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
3360: 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  for sub-journal 
3370: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
3380: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3390: 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74   /* Current writ
33a0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
33b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
33c0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
33d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
33e0: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
33f0: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
3400: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 50 61 67   header */.  Pag
3410: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61  erSavepoint *aSa
3420: 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61  vepoint; /* Arra
3430: 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65  y of active save
3440: 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  points */.  int 
3450: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20  nSavepoint;     
3460: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3470: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
3480: 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f   aSavepoint[] */
3490: 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65  .  char dbFileVe
34a0: 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f  rs[16];        /
34b0: 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76  * Changes whenev
34c0: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
34d0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33   changes */.  u3
34e0: 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  2 sectorSize;   
34f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
3500: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
3510: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
3520: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 45 78 74 72   */..  int nExtr
3530: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
3540: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
3550: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
3560: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
3570: 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
3580: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
3590: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
35a0: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
35b0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  () */.  int page
35c0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
35d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
35e0: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
35f0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
3600: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
3610: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
3620: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
3630: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
3640: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
3650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3660: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3670: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
3680: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
3690: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
36a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
36b0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  file */.  int (*
36c0: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
36d0: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
36e0: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
36f0: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
3700: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
3710: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
3720: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
3730: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66  syHandler */.#if
3740: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3750: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
3760: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
3770: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
3780: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
3790: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
37a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
37b0: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
37c0: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
37d0: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
37e0: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
37f0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
3800: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
3810: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
3820: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
3830: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
3840: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
3850: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
3860: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
3870: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
3880: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
3890: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
38a0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
38b0: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
38c0: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
38d0: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
38e0: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
38f0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
3900: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
3910: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
3920: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
3930: 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74     /* Size limit
3940: 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
3950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
3960: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
3970: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
3980: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
3990: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
39a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
39b0: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
39c0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
39d0: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
39e0: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
39f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
3a00: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
3a10: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
3a20: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
3a30: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
3a40: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
3a50: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
3a60: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
3a70: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
3a80: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
3a90: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
3aa0: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
3ab0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3ac0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
3ad0: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
3ae0: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
3af0: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
3b00: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
3b10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
3b20: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
3b30: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
3b40: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
3b50: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
3b60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
3b70: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
3b80: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
3b90: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
3ba0: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
3bb0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
3bc0: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
3bd0: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
3be0: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
3bf0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
3c00: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
3c10: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
3c20: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
3c30: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
3c40: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
3c50: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
3c60: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
3c70: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
3c80: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
3c90: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
3ca0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
3cb0: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
3cc0: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
3cd0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
3ce0: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
3cf0: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
3d00: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
3d10: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
3d20: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
3d30: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
3d40: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
3d50: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
3d60: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
3d70: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
3d80: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
3d90: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
3da0: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
3db0: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
3dc0: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
3dd0: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
3de0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
3df0: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
3e00: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
3e10: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
3e20: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
3e30: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
3e40: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
3e50: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3e60: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
3e70: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
3e80: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
3e90: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
3ea0: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
3eb0: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
3ec0: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
3ed0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
3ee0: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
3ef0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
3f00: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
3f10: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
3f20: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
3f30: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
3f40: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
3f50: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
3f60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
3f70: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
3f80: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
3f90: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
3fa0: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
3fb0: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
3fc0: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
3fd0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
3fe0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
3ff0: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
4000: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
4010: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
4020: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
4030: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
4040: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
4050: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
4060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
4070: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
4080: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
4090: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
40a0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
40b0: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
40c0: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
40d0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
40e0: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
40f0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
4100: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
4110: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4120: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
4130: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
4140: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
4150: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
4160: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
4170: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
4180: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
4190: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
41a0: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
41b0: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
41c0: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
41d0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
41e0: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
41f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
4200: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
4210: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
4220: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
4230: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
4240: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
4250: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
4260: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
4270: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
4280: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
4290: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
42a0: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
42b0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
42c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
42d0: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
42e0: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
42f0: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
4300: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
4310: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
4320: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
4330: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
4340: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
4350: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
4360: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
4370: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
4380: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
4390: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
43a0: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
43b0: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
43c0: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
43d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
43e0: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
43f0: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
4400: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
4410: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
4420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
4430: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
4440: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
4450: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
4460: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
4470: 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65  47483647..#ifnde
4480: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
4490: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
44a0: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
44b0: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
44c0: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
44d0: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
44e0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
44f0: 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65  ger){..  /* A te
4500: 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79  mp-file is alway
4510: 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55  s in PAGER_EXCLU
4520: 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59  SIVE or PAGER_SY
4530: 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  NCED state. */. 
4540: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
4550: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
4560: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
4570: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
4580: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  ;..  /* The chan
4590: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
45a0: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66   is always set f
45b0: 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f  or temp-files */
45c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
45d0: 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
45e0: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
45f0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
4600: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
4610: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
4620: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
4630: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
4640: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
4650: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
4660: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
4670: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
4680: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
4690: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
46a0: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
46b0: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
46c0: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
46d0: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
46e0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
46f0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
4700: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
4710: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
4720: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
4730: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
4740: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
4750: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
4760: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4770: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
4780: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
4790: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
47a0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f  dr *pPg){.  Pgno
47b0: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
47c0: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
47d0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
47e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
47f0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e  (i=0; i<pPager->
4800: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29  nSavepoint; i++)
4810: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
4820: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
4830: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d  r->aSavepoint[i]
4840: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72  ;.    if( p->nOr
4850: 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73  ig>=pgno && 0==s
4860: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4870: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
4880: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
4890: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
48a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
48b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
48c0: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
48d0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
48e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
48f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4900: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
4910: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
4920: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
4930: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
4940: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
4950: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
4960: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
4970: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
4980: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
4990: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
49a0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
49b0: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
49c0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
49d0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
49e0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
49f0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
4a00: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
4a10: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
4a20: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
4a30: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
4a40: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
4a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
4a60: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
4a70: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
4a80: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
4a90: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4aa0: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
4ab0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
4ac0: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
4ad0: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
4ae0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4af0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
4b00: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
4b10: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
4b20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4b30: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4b40: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
4b50: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
4b60: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
4b70: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
4b80: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
4b90: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
4ba0: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
4bb0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
4bc0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
4bd0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
4be0: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
4bf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
4c00: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
4c10: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4c20: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4c30: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
4c40: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
4c50: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
4c60: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
4c70: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
4c80: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
4c90: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
4ca0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
4cb0: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
4cc0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  set);.}../*.** T
4cd0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
4ce0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
4cf0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
4d00: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
4d10: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
4d20: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
4d30: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
4d40: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
4d50: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
4d60: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
4d70: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
4d80: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
4d90: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
4da0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
4db0: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
4dc0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
4dd0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
4de0: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
4df0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
4e00: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
4e10: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  ods)../*.** If f
4e20: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
4e30: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
4e40: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
4e50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
4e60: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
4e70: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
4e80: 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70  ck){.  if( !isOp
4e90: 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72  en(pFd) ){.    r
4ea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4eb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
4ec0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
4ed0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
4ee0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4ef0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
4f00: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
4f10: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
4f20: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
4f30: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
4f40: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
4f50: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
4f60: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
4f70: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
4f80: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
4f90: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
4fa0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
4fb0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
4fc0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
4fd0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
4fe0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
4ff0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
5000: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
5010: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
5020: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
5030: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
5040: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
5050: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
5060: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
5070: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
5080: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
5090: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
50a0: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
50b0: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
50c0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
50d0: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
50e0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
50f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
5100: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
5110: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
5120: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
5130: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
5140: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
5150: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
5160: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
5170: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
5180: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
5190: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
51a0: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
51b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
51c0: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
51d0: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
51e0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
51f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
5200: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
5210: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
5220: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
5250: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
5260: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
5270: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
5280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
5290: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
52a0: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
52d0: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
52e0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
52f0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
5300: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
5310: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
5320: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
5330: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
5340: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
5350: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
5360: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
5370: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
5380: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
5390: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
53a0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
53b0: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
53c0: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
53d0: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
53e0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
53f0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
5400: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
5410: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
5420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
5430: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
5440: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
5450: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
5460: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
5470: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
5480: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
5490: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
54a0: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
54b0: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
54c0: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
54d0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
54e0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
54f0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
5500: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
5510: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
5520: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
5530: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
5540: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
5550: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
5560: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
5570: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
5580: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
5590: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
55a0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
55b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
55c0: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
55d0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
55e0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
55f0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
5600: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
5610: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
5620: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
5630: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
5640: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
5650: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
5660: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
5670: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
5680: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
5690: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
56a0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
56b0: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
56c0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
56d0: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
56e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
56f0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
5700: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
5710: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
5720: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
5730: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
5740: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
5750: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
5760: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
5770: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
5780: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
5790: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
57a0: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
57b0: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
57c0: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
57d0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
57e0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
57f0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
5800: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
5810: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
5820: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
5830: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
5840: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
5850: 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  er->errCode.    
5860: 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
5870: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
5880: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
5890: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
58a0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
58b0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
58c0: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
58d0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
58e0: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
58f0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
5900: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
5910: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
5920: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
5930: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
5940: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
5950: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
5960: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
5970: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
5980: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
5990: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
59a0: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
59b0: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
59c0: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
59d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
59e0: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
59f0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
5a00: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
5a10: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
5a20: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
5a30: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
5a40: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
5a50: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
5a60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5a70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
5a80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
5a90: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
5aa0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
5ab0: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
5ac0: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
5ad0: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
5ae0: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
5af0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
5b00: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
5b10: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
5b20: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
5b30: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
5b40: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5b50: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
5b60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
5b70: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
5b80: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
5b90: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
5ba0: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
5bb0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
5bc0: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
5bd0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
5be0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
5bf0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
5c00: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
5c10: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
5c20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5c30: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
5c40: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
5c50: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
5c60: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
5c70: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
5c80: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
5c90: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
5ca0: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
5cb0: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
5cc0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
5cd0: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
5ce0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
5cf0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
5d00: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
5d10: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
5d20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5d30: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
5d40: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
5d50: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
5d60: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
5d70: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
5d80: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
5d90: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
5da0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
5db0: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
5dc0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
5dd0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
5de0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
5df0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
5e00: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
5e10: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
5e20: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
5e30: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
5e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
5e50: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
5e60: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
5e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
5e80: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
5e90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5ea0: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
5ed0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
5ee0: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
5ef0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
5f20: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
5f30: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
5f40: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
5f50: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
5f60: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
5f70: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5f80: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
5f90: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
5fa0: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
5fb0: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
5fc0: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
5fd0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
5fe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
5ff0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
6000: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
6010: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
6020: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
6030: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
6040: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
6050: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
6060: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
6070: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6080: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
6090: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
60a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
60b0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
60c0: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
60d0: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
60e0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
60f0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
6100: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
6110: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
6120: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
6130: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
6140: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
6150: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
6160: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
6170: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
6180: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6190: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
61a0: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
61b0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
61c0: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
61d0: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
61e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
61f0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
6200: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
6210: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
6220: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
6230: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6240: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6250: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
6260: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
6270: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
6280: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
6290: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
62a0: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
62b0: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
62c0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
62d0: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
62e0: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
62f0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
6300: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
6310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6330: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
6340: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
6350: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
6360: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
6370: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
6380: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6390: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
63a0: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
63b0: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
63c0: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
63d0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
63e0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
63f0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
6400: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
6410: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
6420: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
6450: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
6460: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
6470: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
6480: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
6490: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
64b0: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
64e0: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
64f0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
6500: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
6510: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
6520: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
6530: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
6540: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
6550: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
6560: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
6570: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
6580: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6590: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
65a0: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
65b0: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
65c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
65d0: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
65e0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
65f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6600: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
6610: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
6620: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
6630: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
6640: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
6650: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
6660: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6670: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
6680: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6690: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
66a0: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
66b0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
66c0: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
66d0: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
66e0: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
66f0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
6700: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
6710: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
6720: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
6730: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
6740: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
6750: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
6760: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
6770: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
6780: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
6790: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
67a0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
67b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
67c0: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
67d0: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
67e0: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
67f0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
6800: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
6810: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
6820: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
6830: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
6840: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
6850: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
6860: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
6870: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
6880: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
6890: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
68a0: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
68b0: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
68c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
68d0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
68e0: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
68f0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
6900: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
6910: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
6920: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
6930: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
6940: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
6950: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
6960: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
6970: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
6980: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
6990: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
69a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
69b0: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
69c0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
69d0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
69e0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
69f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
6a00: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
6a10: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
6a20: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
6a30: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
6a40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a70: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
6a80: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
6a90: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
6aa0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6ab0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
6ac0: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
6ad0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
6ae0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
6af0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
6b00: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
6b10: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
6b20: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
6b30: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
6b40: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
6b50: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
6b60: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
6b70: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
6b80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6b90: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
6ba0: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
6bb0: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
6bc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6bd0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6be0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
6bf0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
6c00: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
6c10: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
6c20: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
6c30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6c40: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
6c50: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
6c60: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
6c70: 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
6c80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
6c90: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
6ca0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
6cb0: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
6cc0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
6cd0: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
6ce0: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
6cf0: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
6d00: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
6d10: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
6d20: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
6d30: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
6d40: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
6d50: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
6d60: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
6d70: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
6d80: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
6d90: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
6da0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
6db0: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
6dc0: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
6dd0: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
6de0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
6df0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
6e00: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
6e10: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
6e20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
6e30: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
6e40: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
6e50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6e60: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
6e70: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
6e80: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
6e90: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
6ea0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
6eb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6ec0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
6ed0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6ee0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
6ef0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6f00: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
6f10: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
6f20: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
6f30: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
6f40: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
6f50: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
6f60: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6f70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
6f80: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
6f90: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
6fa0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
6fb0: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
6fc0: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
6fd0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
6fe0: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
6ff0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
7000: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
7010: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
7020: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
7030: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
7040: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
7050: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
7060: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
7070: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
7080: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
7090: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
70a0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
70b0: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
70c0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
70d0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
70e0: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
70f0: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
7100: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
7110: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
7120: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7130: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
7140: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7150: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7160: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
7170: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7180: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
7190: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
71a0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f  r->pTmpSpace;  /
71b0: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
71c0: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
71d0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
71e0: 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  nHeader = pPager
71f0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  ->pageSize;     
7200: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
7210: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
7220: 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32  zHeader */.  u32
7230: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61   /* Bytes of hea
7260: 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74  der sector writt
7270: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  en */.  int ii; 
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
72a0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
72b0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
72c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
72d0: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
72e0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
72f0: 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48  en. */..  if( nH
7300: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
7310: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
7320: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
7330: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7340: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
7350: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
7360: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
7370: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77  nd any of them w
7380: 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a  ere created .  *
7390: 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  * since the most
73a0: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
73b0: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
73c0: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a  en, update the .
73d0: 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
73e0: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
73f0: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
7400: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
7410: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
7420: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
7430: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
7440: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
7450: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
7460: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
7470: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
7480: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
7490: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
74a0: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
74b0: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
74c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
74d0: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
74e0: 70 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70  pPager);.  memcp
74f0: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
7500: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
7510: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
7520: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
7530: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
7540: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
7550: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
7560: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
7570: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
7580: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
7590: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
75a0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
75b0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
75c0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
75d0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
75e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
75f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
7600: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
7610: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
7620: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
7630: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
7640: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
7650: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
7660: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
7670: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
7680: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
7690: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
76a0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
76b0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
76c0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
76d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
76e0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
76f0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
7700: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
7710: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
7720: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
7730: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
7740: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
7750: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
7760: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
7770: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
7780: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
7790: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
77a0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
77b0: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
77c0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
77d0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
77e0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
77f0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
7800: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
7810: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
7820: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
7830: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
7840: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
7850: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
7860: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
7870: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
7880: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
7890: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
78a0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
78b0: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
78c0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
78d0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
78e0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
78f0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
7900: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
7910: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
7920: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
7930: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
7940: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f   if( (pPager->no
7950: 53 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72  Sync) || (pPager
7960: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
7970: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7980: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
7990: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
79a0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
79b0: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
79c0: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
79d0: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  END) .  ){.    p
79e0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
79f0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7a00: 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66  lMagic)], 0xffff
7a10: 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffff);.  }else{.
7a20: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
7a30: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7a40: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7a50: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
7a60: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
7a70: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
7a80: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
7a90: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
7aa0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7ab0: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
7ac0: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
7ad0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
7ae0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7af0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
7b00: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
7b10: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
7b20: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
7b30: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7b40: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7b50: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
7b60: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
7b70: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
7b80: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
7b90: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
7ba0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7bb0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7bc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
7bd0: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
7be0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
7bf0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
7c00: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7c10: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7c20: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
7c30: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
7c40: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7c50: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
7c60: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
7c70: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
7c80: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
7c90: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
7ca0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
7cb0: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
7cc0: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
7cd0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
7ce0: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
7cf0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
7d00: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
7d10: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
7d20: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
7d30: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
7d40: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
7d50: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7d60: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
7d70: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
7d80: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7d90: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
7da0: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
7db0: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
7dc0: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
7dd0: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
7de0: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
7df0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
7e00: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
7e10: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
7e20: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
7e30: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
7e40: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
7e50: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
7e60: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
7e70: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
7e80: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
7e90: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
7ea0: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
7eb0: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
7ec0: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
7ed0: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
7ee0: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
7ef0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
7f00: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
7f10: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
7f20: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
7f30: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
7f40: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
7f50: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
7f60: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
7f70: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
7f80: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
7f90: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
7fa0: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
7fb0: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
7fc0: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
7fd0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
7fe0: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
7ff0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
8000: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
8010: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
8020: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
8030: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
8040: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
8050: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
8060: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
8070: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
8080: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
8090: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
80a0: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
80b0: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
80c0: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
80d0: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
80e0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
80f0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
8100: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
8110: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
8120: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
8130: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
8140: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
8150: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
8160: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
8170: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
8180: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
8190: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
81a0: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
81b0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
81c0: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
81d0: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
81e0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
81f0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
8200: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
8210: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
8220: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
8230: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
8240: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8250: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
8270: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
8280: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
8290: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
82a0: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
82b0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
82c0: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
82d0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
82e0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
82f0: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
8300: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
8310: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
8320: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
8330: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
8340: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
8350: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
8360: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
8370: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
8380: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
8390: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
83a0: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
83b0: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
83c0: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
83d0: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
83e0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
83f0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
8400: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
8410: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
8420: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
8430: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
8440: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
8450: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8460: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
8470: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
8480: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
8490: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
84a0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
84b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
84c0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
84d0: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
84e0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
84f0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8500: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
8510: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
8520: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
8530: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
8540: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
8550: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
8560: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
8570: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
8580: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
8590: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
85a0: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
85b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
85c0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
85d0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
85e0: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8600: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
8610: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
8620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8630: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
8640: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
8650: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
8660: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
8670: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8680: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
8690: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
86a0: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
86d0: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
86e0: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
86f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
8720: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
8730: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
8740: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
8750: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
8760: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
8770: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
8780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8790: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
87a0: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
87b0: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
87c0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
87d0: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
87e0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
87f0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
8800: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
8810: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
8820: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
8830: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
8840: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
8850: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
8860: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
8870: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
8880: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
8890: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
88a0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
88b0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
88c0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
88d0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
88e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
88f0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
8900: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
8910: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
8920: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8930: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
8940: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
8950: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
8960: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
8970: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
8980: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
8990: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
89a0: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
89b0: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
89c0: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
89d0: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
89e0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
89f0: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
8a00: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
8a10: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
8a20: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
8a30: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
8a40: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
8a50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8a60: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
8a70: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
8a80: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
8a90: 66 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ff);.  if( rc ){
8aa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8ab0: 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70    }.  if( memcmp
8ac0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
8ad0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
8ae0: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
8af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b00: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  DONE;.  }..  /* 
8b10: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
8b20: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
8b30: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
8b40: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
8b50: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
8b60: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
8b70: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
8b80: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
8b90: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
8ba0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
8bb0: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
8bc0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
8bd0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
8be0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
8bf0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
8c00: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
8c10: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
8c20: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
8c30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
8c40: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
8c50: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
8c60: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
8c70: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
8c80: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
8c90: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
8ca0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
8cb0: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
8cc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8cd0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
8ce0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
8cf0: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
8d00: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
8d10: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
8d20: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8d30: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8d40: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
8d50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
8d60: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
8d70: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
8d80: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  eader */.    u16
8d90: 20 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20   iPageSize16;   
8da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
8db0: 79 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69  y of iPageSize i
8dc0: 6e 20 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c  n 16-bit variabl
8dd0: 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  e */..    /* Rea
8de0: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
8df0: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
8e00: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
8e10: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
8e20: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
8e30: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
8e40: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
8e50: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
8e60: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
8e70: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
8e80: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
8e90: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
8ea0: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
8eb0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
8ec0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
8ed0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
8ee0: 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
8ef0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
8f00: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
8f10: 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
8f20: 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
8f30: 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
8f40: 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
8f50: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
8f60: 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
8f70: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
8f80: 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 2c  or equal to 512,
8f90: 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72   and not greater
8fa0: 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20   than their .   
8fb0: 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63   ** respective c
8fc0: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69  ompile time maxi
8fd0: 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20  mum limits..    
8fe0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
8ff0: 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20  Size<512        
9000: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65            || iSe
9010: 63 74 6f 72 53 69 7a 65 3c 35 31 32 0a 20 20 20  ctorSize<512.   
9020: 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
9030: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
9040: 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
9050: 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
9060: 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
9070: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
9080: 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
9090: 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
90a0: 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
90b0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
90c0: 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
90d0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
90e0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
90f0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
9100: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
9110: 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
9120: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
9130: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
9140: 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
9150: 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
9160: 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
9170: 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
9180: 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
9190: 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
91a0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
91b0: 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
91c0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
91d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
91e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
91f0: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
9200: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
9210: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
9220: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
9230: 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
9240: 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
9250: 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
9260: 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
9270: 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
9280: 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
9290: 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
92a0: 20 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20    iPageSize16 = 
92b0: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a  (u16)iPageSize;.
92c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
92d0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
92e0: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
92f0: 69 7a 65 31 36 29 3b 0a 20 20 20 20 74 65 73 74  ize16);.    test
9300: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
9310: 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _OK );.    asser
9320: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
9330: 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d   || iPageSize16=
9340: 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 20  =(u16)iPageSize 
9350: 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
9360: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
9370: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
9380: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
9390: 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
93a0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
93b0: 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
93c0: 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
93d0: 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
93e0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
93f0: 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
9400: 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
9410: 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
9420: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
9430: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
9440: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
9450: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
9460: 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
9470: 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
9480: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
9490: 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
94a0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
94b0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
94c0: 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
94d0: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
94e0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
94f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9500: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
9510: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
9520: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
9530: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9540: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
9550: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
9560: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
9570: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
9580: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
9590: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
95a0: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
95b0: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
95c0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
95d0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
95e0: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
95f0: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
9600: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
9610: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
9620: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
9630: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
9640: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
9650: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
9660: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
9670: 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
9680: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
9690: 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
96a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
96b0: 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
96c0: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
96d0: 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
96e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
96f0: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
9700: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
9710: 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
9720: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9730: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
9740: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
9750: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
9760: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
9770: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
9780: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
9790: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
97a0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
97b0: 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
97c0: 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
97d0: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
97e0: 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
97f0: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
9800: 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
9810: 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
9820: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
9830: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
9840: 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
9850: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
9860: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
9870: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
9880: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
9890: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
98a0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
98d0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
98e0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9900: 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
9910: 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
9920: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
9950: 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
9960: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
9970: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
9980: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
9990: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
99a0: 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
99b0: 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99d0: 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
99e0: 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
99f0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
9a00: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
9a10: 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  ter.   || pPager
9a20: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9a30: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9a40: 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
9a50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
9a60: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9a70: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
9a80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9a90: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
9aa0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
9ab0: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
9ac0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
9ad0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c   );..  /* Calcul
9ae0: 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69  ate the length i
9af0: 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  n bytes and the 
9b00: 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73  checksum of zMas
9b10: 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61  ter */.  for(nMa
9b20: 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b  ster=0; zMaster[
9b30: 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65  nMaster]; nMaste
9b40: 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  r++){.    cksum 
9b50: 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  += zMaster[nMast
9b60: 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er];.  }..  /* I
9b70: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
9b80: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
9b90: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
9ba0: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
9bb0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
9bc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
9bd0: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
9be0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
9bf0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
9c00: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
9c10: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
9c20: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
9c30: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
9c40: 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
9c50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
9c60: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
9c70: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
9c80: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
9c90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
9ca0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
9cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61  aster journal da
9cc0: 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ta to the end of
9cd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9ce0: 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72  e. If.  ** an er
9cf0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
9d00: 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
9d10: 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
9d20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21  .  */.  if( (0 !
9d30: 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
9d40: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
9d50: 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f   iHdrOff, PAGER_
9d60: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
9d70: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
9d80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9d90: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
9da0: 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65   zMaster, nMaste
9db0: 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a  r, iHdrOff+4))).
9dc0: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
9dd0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
9de0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9df0: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d  ff+4+nMaster, nM
9e00: 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28  aster))).   || (
9e10: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
9e20: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9e30: 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
9e40: 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29  aster+4, cksum))
9e50: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
9e60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9e70: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9e80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
9e90: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9ea0: 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
9eb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
9ec0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9ed0: 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
9ee0: 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  r+20);.  pPager-
9ef0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
9f00: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20  ger->noSync;..  
9f10: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
9f20: 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
9f30: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
9f40: 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
9f50: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
9f60: 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
9f70: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
9f80: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
9f90: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
9fa0: 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
9fb0: 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
9fc0: 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
9fd0: 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
9fe0: 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
9ff0: 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
a000: 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
a010: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
a020: 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
a030: 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
a040: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
a050: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
a060: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
a070: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
a080: 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
a090: 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
a0a0: 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
a0b0: 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
a0c0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
a0d0: 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
a0e0: 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
a0f0: 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
a100: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
a110: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
a120: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
a130: 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
a140: 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
a150: 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
a160: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a170: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
a180: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
a190: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
a1a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a1b0: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
a1c0: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
a1d0: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
a1e0: 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
a1f0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
a200: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
a210: 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
a220: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
a230: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
a240: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
a250: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
a260: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
a270: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
a280: 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
a2b0: 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
a2c0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
a2d0: 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
a2e0: 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
a2f0: 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
a300: 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
a310: 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
a320: 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
a330: 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
a340: 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
a350: 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
a360: 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
a370: 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
a380: 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
a390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
a3a0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
a3b0: 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69   error-state, di
a3c0: 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
a3d0: 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a  ory pages. If.**
a3e0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
a3f0: 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68   error-state, th
a400: 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  en this call is 
a410: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
a420: 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20  ODO: Why can we 
a430: 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20 70 61  not reset the pa
a440: 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72  ger while in err
a450: 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61  or state?.*/.sta
a460: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
a470: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
a480: 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54  er){.  if( SQLIT
a490: 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72  E_OK==pPager->er
a4a0: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  rCode ){.    sql
a4b0: 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
a4c0: 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
a4d0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  p);.    sqlite3P
a4e0: 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
a4f0: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
a500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
a510: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
a520: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
a530: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
a540: 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
a550: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
a560: 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
a570: 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
a580: 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
a590: 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
a5a0: 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
a5b0: 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
a5c0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
a5d0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
a5e0: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
a5f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a600: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
a610: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
a620: 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
a630: 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
a640: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
a650: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
a660: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
a670: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
a680: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
a690: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
a6a0: 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
a6b0: 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
a6c0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
a6d0: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  eMode ){.    sql
a6e0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
a6f0: 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
a700: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
a710: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a720: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
a730: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
a740: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a750: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
a760: 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
a770: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
a780: 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
a790: 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
a7a0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
a7b0: 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
a7c0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
a7d0: 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
a7e0: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
a7f0: 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
a800: 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
a810: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
a820: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
a830: 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
a840: 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
a850: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
a860: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a880: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
a890: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
a8a0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
a8b0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
a8c0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
a8d0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
a8e0: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
a8f0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
a900: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
a910: 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
a920: 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
a930: 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
a940: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
a950: 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
a960: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
a970: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
a980: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
a990: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
a9a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
a9b0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
a9c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
a9d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a9e0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
a9f0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
aa00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
aa10: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
aa20: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
aa30: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
aa40: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
aa50: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
aa60: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
aa70: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
aa80: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
aa90: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
aaa0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
aab0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
aac0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
aad0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
aae0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
aaf0: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
ab00: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
ab10: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
ab20: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
ab30: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ab40: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
ab50: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
ab60: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
ab70: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
ab80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
ab90: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
aba0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
abb0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
abc0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
abd0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
abe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
abf0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
ac00: 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73    /* Always clos
ac10: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
ac20: 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
ac30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
ac40: 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  ck..    ** Other
ac50: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
ac60: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
ac70: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
ac80: 65 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64  e might.    ** d
ac90: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f  elete the file o
aca0: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
acb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
acc0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
acd0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71  er->jfd);.    sq
ace0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
acf0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
ad00: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
ad10: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
ad20: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41   0;.    releaseA
ad30: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
ad40: 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
ad50: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
ad60: 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20  ocked, somebody 
ad70: 65 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67  else might chang
ad80: 65 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a  e it. The.    **
ad90: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
ada0: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65  n Pager.dbSize e
adb0: 74 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  tc. might become
adc0: 20 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20   invalid if.    
add0: 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  ** this happens.
ade0: 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79 2c 20 74   TODO: Really, t
adf0: 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  his doesn't need
ae00: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20   to be cleared. 
ae10: 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20     ** until the 
ae20: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
ae30: 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 70 61  heck fails in pa
ae40: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e  gerSharedLock().
ae50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
ae60: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
ae70: 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = 0;..    rc = o
ae80: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
ae90: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
aea0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
aeb0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
aec0: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
aed0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
aee0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
aef0: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
af00: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
af10: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
af20: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
af30: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
af40: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
af50: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
af60: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
af70: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
af80: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
af90: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
afa0: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
afb0: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
afc0: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
afd0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
afe0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
aff0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b000: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
b010: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
b020: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
b030: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
b040: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
b050: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
b060: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
b070: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
b080: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
b090: 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NLOCK;.  }.}../*
b0a0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b0b0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
b0c0: 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52  ed when an IOERR
b0d0: 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c  , CORRUPT or FUL
b0e0: 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68  L error.** may h
b0f0: 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68  ave occurred. Th
b100: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
b110: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
b120: 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73   the pager .** s
b130: 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
b140: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
b150: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
b160: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
b170: 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63  ger .** API func
b180: 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20  tion. The value 
b190: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
b1a0: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
b1b0: 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f   argument .** to
b1c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
b1d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
b1e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
b1f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
b200: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
b210: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
b220: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
b230: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
b240: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
b250: 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  en error is clea
b260: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
b270: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
b280: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
b290: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
b2a0: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
b2b0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
b2c0: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
b2d0: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
b2e0: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
b2f0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
b300: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
b310: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
b320: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
b330: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
b340: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
b350: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
b360: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
b370: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
b380: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
b390: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
b3a0: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
b3b0: 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
b3c0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
b3d0: 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
b3e0: 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
b3f0: 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
b400: 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
b410: 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
b420: 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
b430: 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
b440: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
b450: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
b460: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
b470: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
b480: 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  f;.  assert(.   
b490: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
b4a0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
b4b0: 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
b4c0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
b4d0: 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
b4e0: 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
b4f0: 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
b500: 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
b510: 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  (.    rc2==SQLIT
b520: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63  E_FULL ||.    rc
b530: 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  2==SQLITE_IOERR 
b540: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
b550: 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a  TE_CORRUPT.  ){.
b560: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
b570: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66  ode = rc;.    if
b580: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
b590: 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20  =PAGER_UNLOCK . 
b5a0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63      && sqlite3Pc
b5b0: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
b5c0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
b5d0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
b5e0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
b5f0: 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b  s already unlock
b600: 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75  ed, call pager_u
b610: 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20  nlock() now to. 
b620: 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68       ** clear th
b630: 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e  e error state an
b640: 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  d ensure that th
b650: 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69 73  e pager-cache is
b660: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c   .      ** compl
b670: 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20  etely empty..   
b680: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65     */.      page
b690: 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
b6a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
b6b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b6c0: 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c  * Execute a roll
b6d0: 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61  back if a transa
b6e0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
b6f0: 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
b700: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
b710: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
b720: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
b730: 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72  y entered the er
b740: 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ror state, do no
b750: 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68  t attempt .** th
b760: 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68  e rollback at th
b770: 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64  is time. Instead
b780: 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  , pager_unlock()
b790: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a   is called. The.
b7a0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
b7b0: 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64  _unlock() will d
b7c0: 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
b7d0: 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f  mory pages, unlo
b7e0: 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ck.** the databa
b7f0: 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61  se file and clea
b800: 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
b810: 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73  e. If this means
b820: 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69   that.** there i
b830: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
b840: 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
b850: 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78  -system, the nex
b860: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  t connection.** 
b870: 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
b880: 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
b890: 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
b8a0: 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c  be this one) wil
b8b0: 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63  l.** roll it bac
b8c0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
b8d0: 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
b8e0: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
b8f0: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62  e error state, b
b900: 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
b910: 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
b920: 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
b930: 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
b940: 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
b950: 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
b960: 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
b970: 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  or state. Which 
b980: 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
b990: 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
b9a0: 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
b9b0: 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
b9c0: 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
b9d0: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
b9e0: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
b9f0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
ba00: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
ba10: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  e==SQLITE_OK && 
ba20: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
ba30: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
ba40: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
ba50: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
ba60: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
ba70: 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
ba80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
ba90: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
baa0: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
bab0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ock(pPager);.}..
bac0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
bad0: 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
bae0: 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63  ction. A transac
baf0: 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20  tion is usually 
bb00: 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74  ended by .** eit
bb10: 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  her a COMMIT or 
bb20: 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61  a ROLLBACK opera
bb30: 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  tion. This routi
bb40: 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ne may be called
bb50: 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62   .** after rollb
bb60: 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ack of a hot-jou
bb70: 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  rnal, or if an e
bb80: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
bb90: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65  e opening.** the
bba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
bbb0: 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72   writing the ver
bbc0: 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  y first journal-
bbd0: 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64  header of a.** d
bbe0: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
bbf0: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ion..** .** If t
bc00: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  he pager is in P
bc10: 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50  AGER_SHARED or P
bc20: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
bc30: 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  e when this.** r
bc40: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
bc50: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20  , it is a no-op 
bc60: 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f  (returns SQLITE_
bc70: 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  OK)..**.** Other
bc80: 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65  wise, any active
bc90: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
bca0: 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
bcb0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
bcc0: 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ile is open, the
bcd0: 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a  n it is "finaliz
bce0: 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72  ed". Once a jour
bcf0: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73  nal .** file has
bd00: 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
bd10: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
bd20: 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20  le to use it to 
bd30: 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20  roll back a .** 
bd40: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72  transaction. Nor
bd50: 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73   will it be cons
bd60: 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68  idered to be a h
bd70: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68  ot-journal by th
bd80: 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68  is.** or any oth
bd90: 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
bda0: 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20  ection. Exactly 
bdb0: 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73  how a journal is
bdc0: 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65   finalized.** de
bdd0: 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
bde0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65   or not the page
bdf0: 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
be00: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
be10: 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  nd.** the curren
be20: 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28  t journal-mode (
be30: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
be40: 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c  e value), as fol
be50: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  lows:.**.**   jo
be60: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
be70: 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  Y.**     Journal
be80: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
be90: 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65   is simply close
bea0: 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73  d. This destroys
beb0: 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d   an .**     in-m
bec0: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  emory journal..*
bed0: 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
bee0: 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20  de==TRUNCATE.** 
bef0: 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
bf00: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
bf10: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
bf20: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ize..**.**   jou
bf30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
bf40: 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72  T.**     The fir
bf50: 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74  st 28 bytes of t
bf60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bf70: 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73  are zeroed. This
bf80: 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20   invalidates.** 
bf90: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f      the first jo
bfa0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
bfb0: 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65  the file, and he
bfc0: 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  nce the entire j
bfd0: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
bfe0: 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a  le. An invalid j
bff0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e  ournal file cann
c000: 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
c010: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  k..**.**   journ
c020: 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a  alMode==DELETE.*
c030: 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  *     The journa
c040: 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
c050: 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69   and deleted usi
c060: 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
c070: 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te()..**.**     
c080: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
c090: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
c0a0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20  sive mode, this 
c0b0: 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69  method of finali
c0c0: 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20  zing.**     the 
c0d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
c0e0: 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74  never used. Inst
c0f0: 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  ead, if the jour
c100: 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20  nalMode is.**   
c110: 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65    DELETE and the
c120: 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
c130: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
c140: 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65   method describe
c150: 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a  d under.**     j
c160: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
c170: 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74  IST is used inst
c180: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ead..**.** After
c190: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
c1a0: 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75  finalized, if ru
c1b0: 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
c1c0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
c1d0: 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20  .** pager moves 
c1e0: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
c1f0: 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67  state (and downg
c200: 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f  rades the lock o
c210: 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
c220: 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67  e file according
c230: 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ly)..**.** If th
c240: 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
c250: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
c260: 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50  mode and is in P
c270: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
c280: 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74  e,.** it moves t
c290: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
c2a0: 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  E. No locks are 
c2b0: 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20  downgraded when 
c2c0: 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78  running in.** ex
c2d0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
c2e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
c2f0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
c300: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
c310: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c320: 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
c330: 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
c340: 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
c350: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c360: 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
c370: 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
c380: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
c390: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
c3a0: 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
c3b0: 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
c3c0: 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
c3d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
c3e0: 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
c3f0: 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
c400: 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
c410: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
c420: 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
c430: 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
c440: 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
c450: 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
c460: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
c470: 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
c480: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
c490: 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
c4a0: 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
c4b0: 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
c4c0: 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
c4d0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
c4e0: 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
c4f0: 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
c500: 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
c510: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
c520: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
c530: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
c540: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  from journal fin
c550: 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74  alization operat
c560: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ion */.  int rc2
c570: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
c580: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
c590: 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c  from db file unl
c5a0: 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ock operation */
c5b0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
c5c0: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
c5d0: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
c5e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c5f0: 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  }.  releaseAllSa
c600: 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
c610: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ;..  assert( isO
c620: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
c630: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
c640: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69  ournal==0 );.  i
c650: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
c660: 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20 20 20 2f  ->jfd) ){..    /
c670: 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65 27 73 20  * TODO: There's 
c680: 61 20 70 72 6f 62 6c 65 6d 20 68 65 72 65 20 69  a problem here i
c690: 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  f a journal-file
c6a0: 20 77 61 73 20 6f 70 65 6e 65 64 20 69 6e 20 4d   was opened in M
c6b0: 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20 6d 6f 64  EMORY.    ** mod
c6c0: 65 20 61 6e 64 20 74 68 65 6e 20 74 68 65 20 6a  e and then the j
c6d0: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 63  ournal-mode is c
c6e0: 68 61 6e 67 65 64 20 74 6f 20 54 52 55 4e 43 41  hanged to TRUNCA
c6f0: 54 45 20 6f 72 20 50 45 52 53 49 53 54 0a 20 20  TE or PERSIST.  
c700: 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
c710: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
c720: 73 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65  s code should be
c730: 20 63 68 61 6e 67 65 64 20 74 6f 20 61 73 73 75   changed to assu
c740: 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  me.    ** that t
c750: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  he journal mode 
c760: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20  has not changed 
c770: 73 69 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61  since the transa
c780: 63 74 69 6f 6e 20 77 61 73 0a 20 20 20 20 2a 2a  ction was.    **
c790: 20 73 74 61 72 74 65 64 2e 20 41 6e 64 20 74 68   started. And th
c7a0: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  e sqlite3PagerJo
c7b0: 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66 75 6e 63  urnalMode() func
c7c0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a 20  tion should be. 
c7d0: 20 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f     ** changed to
c7e0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
c7f0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
c800: 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 0a 20 20   too..    */..  
c810: 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
c820: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
c830: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
c840: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
c850: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
c860: 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
c870: 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f    int isMemoryJo
c880: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49  urnal = sqlite3I
c890: 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sMemJournal(pPag
c8a0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
c8b0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c8c0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c8d0: 20 20 20 69 66 28 20 21 69 73 4d 65 6d 6f 72 79     if( !isMemory
c8e0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
c8f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c900: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
c910: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
c920: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
c930: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
c940: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c950: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
c960: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
c970: 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
c980: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
c990: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
c9a0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
c9b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
c9c0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c9d0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
c9e0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
c9f0: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
ca00: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20  veMode .     || 
ca10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
ca20: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ca30: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
ca40: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
ca50: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
ca60: 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
ca70: 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
ca80: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
ca90: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
caa0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
cab0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
cac0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
cad0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
cae0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
caf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
cb00: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
cb10: 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20  DE_DELETE || rc 
cb20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cb30: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
cb40: 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
cb50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
cb60: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
cb70: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
cb80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
cb90: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
cba0: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
cbb0: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
cbc0: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
cbd0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
cbe0: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
cbf0: 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
cc00: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
cc10: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
cc20: 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  h);.#endif..    
cc30: 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
cc40: 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
cc50: 43 61 63 68 65 29 3b 0a 20 20 20 20 73 71 6c 69  Cache);.    sqli
cc60: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
cc70: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
cc80: 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
cc90: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
cca0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
ccb0: 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  ec = 0;.  }..  i
ccc0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
ccd0: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
cce0: 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28   rc2 = osUnlock(
ccf0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
cd00: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
cd10: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
cd20: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
cd30: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
cd40: 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
cd50: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
cd60: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
cd70: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
cd80: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
cd90: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
cda0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
cdb0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
cdc0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
cdd0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  ;.  pPager->dbMo
cde0: 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  dified = 0;..  /
cdf0: 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20  * TODO: Is this 
ce00: 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20  optimal? Why is 
ce10: 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61  the db size inva
ce20: 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a 20 20  lidated here .  
ce30: 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74 61  ** when the data
ce40: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
ce50: 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20   unlocked? */.  
ce60: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
ce70: 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ze = 0;.  sqlite
ce80: 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
ce90: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
cea0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
ceb0: 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
cec0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
ced0: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
cee0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
cef0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
cf00: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  rc);.}../*.** Pa
cf10: 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
cf20: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
cf30: 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
cf40: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
cf50: 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
cf60: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
cf70: 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
cf80: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
cf90: 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
cfa0: 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
cfb0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
cfc0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
cfd0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
cfe0: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
cff0: 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
d000: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
d010: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
d020: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
d030: 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
d040: 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
d050: 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
d060: 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
d070: 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
d080: 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
d090: 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
d0a0: 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
d0b0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
d0c0: 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
d0d0: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
d0e0: 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
d0f0: 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
d100: 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
d110: 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
d120: 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
d130: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
d140: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
d150: 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
d160: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
d170: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
d180: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
d190: 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
d1a0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
d1b0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
d1c0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
d1d0: 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
d1e0: 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
d1f0: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
d200: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
d210: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
d220: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
d230: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
d240: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
d250: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
d260: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
d270: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
d280: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
d290: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
d2a0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
d2b0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
d2c0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
d2d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
d2e0: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
d2f0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
d300: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
d310: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
d320: 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
d330: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
d340: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d350: 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
d360: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d370: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
d380: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
d390: 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
d3a0: 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
d3b0: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
d3c0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
d3d0: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
d3e0: 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
d3f0: 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
d400: 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
d410: 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
d420: 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
d430: 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
d440: 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
d450: 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
d460: 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
d470: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
d480: 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
d490: 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
d4a0: 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
d4b0: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
d4c0: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
d4d0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  al..**.** The is
d4e0: 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73  MainJrnl flag is
d4f0: 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
d500: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
d510: 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a  ck journal and.*
d520: 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20  * false for the 
d530: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d540: 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c  l.  The main rol
d550: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73  lback journal us
d560: 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20  es.** checksums 
d570: 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
d580: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
d590: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
d5a0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
d5b0: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
d5c0: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
d5d0: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
d5e0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
d5f0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
d600: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
d610: 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
d620: 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
d630: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
d640: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
d650: 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
d660: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
d670: 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
d680: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
d690: 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
d6a0: 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
d6b0: 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
d6c0: 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
d6d0: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
d6e0: 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
d6f0: 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
d700: 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
d710: 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
d720: 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
d730: 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
d740: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
d750: 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
d760: 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
d770: 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
d780: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
d790: 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
d7a0: 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
d7b0: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
d7c0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
d7d0: 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
d7e0: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
d7f0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
d800: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d810: 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
d820: 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
d830: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
d840: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
d850: 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
d860: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d870: 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
d880: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
d890: 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
d8a0: 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
d8b0: 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
d8c0: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
d8d0: 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
d8e0: 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
d8f0: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
d900: 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
d910: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
d920: 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
d930: 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
d940: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
d950: 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
d960: 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
d970: 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
d980: 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
d990: 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
d9a0: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
d9b0: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
d9c0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
d9d0: 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
d9e0: 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
d9f0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
da00: 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
da10: 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
da20: 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
da30: 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
da40: 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
da50: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
da60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
da70: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
da80: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
da90: 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
daa0: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
dab0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
dac0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
dad0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
dae0: 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
daf0: 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
db00: 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
db10: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
db20: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
db30: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
db40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db60: 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
db70: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
db80: 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
db90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dba0: 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
dbb0: 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
dbc0: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
dbd0: 20 69 73 55 6e 73 79 6e 63 2c 20 20 20 20 20 20   isUnsync,      
dbe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
dbf0: 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 66 72  ue if reading fr
dc00: 6f 6d 20 75 6e 73 79 6e 63 65 64 20 6d 61 69 6e  om unsynced main
dc10: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
dc20: 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
dc40: 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
dc50: 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
dc60: 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 2c 20   int isSavepnt, 
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc80: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
dc90: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
dca0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
dcb0: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
dcc0: 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
dcd0: 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
dce0: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a  ayed back */.){.
dcf0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
dd00: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
dd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
dd20: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
dd30: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
dd40: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd60: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
dd70: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
dd80: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
dd90: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
dda0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
ddb0: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
ddc0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
ddd0: 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20  .  u8 *aData;   
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74   /* Temporary st
de00: 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61  orage for the pa
de10: 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ge */.  sqlite3_
de20: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
de30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
de40: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
de50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
de60: 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
de70: 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d  (isMainJrnl&~1)=
de80: 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73  =0 );      /* is
de90: 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72  MainJrnl is 0 or
dea0: 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
deb0: 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d  (isSavepnt&~1)==
dec0: 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73  0 );       /* is
ded0: 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20  Savepnt is 0 or 
dee0: 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  1 */.  assert( i
def0: 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f  sMainJrnl || pDo
df00: 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f  ne );     /* pDo
df10: 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f  ne always used o
df20: 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  n sub-journals *
df30: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
df40: 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d  vepnt || pDone==
df50: 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20  0 );   /* pDone 
df60: 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f  never used on no
df70: 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a  n-savepoint */..
df80: 20 20 61 44 61 74 61 20 3d 20 28 75 38 2a 29 70    aData = (u8*)p
df90: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
dfa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
dfb0: 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
dfc0: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
dfd0: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
dfe0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
dff0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
e000: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
e010: 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74  page data from t
e020: 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  he journal or su
e030: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  b-journal.  ** f
e040: 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ile. Return an e
e050: 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
e060: 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f   caller if an IO
e070: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20   error occurs.. 
e080: 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61   */.  jfd = isMa
e090: 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d  inJrnl ? pPager-
e0a0: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
e0b0: 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
e0c0: 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66  32bits(jfd, *pOf
e0d0: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
e0e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e0f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
e100: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
e110: 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20  ead(jfd, aData, 
e120: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e130: 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b  , (*pOffset)+4);
e140: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e150: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
e160: 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20  ;.  *pOffset += 
e170: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e180: 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e   + 4 + isMainJrn
e190: 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  l*4;..  /* Sanit
e1a0: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
e1b0: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
e1c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
e1d0: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
e1e0: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
e1f0: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
e200: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
e210: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
e220: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
e230: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
e240: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
e250: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
e260: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
e270: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
e280: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
e290: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
e2a0: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
e2b0: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
e2c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
e2d0: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
e2e0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
e2f0: 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
e300: 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  ( !isSavepnt );.
e310: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e320: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
e330: 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61  ( pgno>(Pgno)pPa
e340: 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73  ger->dbSize || s
e350: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
e360: 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b  (pDone, pgno) ){
e370: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e380: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
e390: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
e3a0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
e3b0: 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65  ts(jfd, (*pOffse
e3c0: 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  t)-4, &cksum);. 
e3d0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
e3e0: 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21  rn rc;.    if( !
e3f0: 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67  isSavepnt && pag
e400: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
e410: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
e420: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
e430: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
e440: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f  }.  }..  if( pDo
e450: 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69  ne && (rc = sqli
e460: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f  te3BitvecSet(pDo
e470: 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49  ne, pgno))!=SQLI
e480: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
e490: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  urn rc;.  }..  a
e4a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
e4b0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
e4c0: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
e4d0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
e4e0: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
e4f0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
e500: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
e510: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
e520: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
e530: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
e540: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
e550: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
e560: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
e570: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
e580: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
e590: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
e5a0: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
e5b0: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
e5c0: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
e5d0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
e5e0: 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
e5f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
e600: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
e610: 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
e620: 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
e630: 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
e640: 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
e650: 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
e660: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
e670: 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
e680: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
e690: 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
e6a0: 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
e6b0: 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
e6c0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
e6d0: 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
e6e0: 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
e6f0: 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
e700: 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
e710: 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
e720: 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
e730: 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
e740: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
e750: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
e760: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
e770: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
e780: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
e790: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
e7a0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
e7b0: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
e7c0: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
e7d0: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
e7e0: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
e7f0: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
e800: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
e810: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
e820: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
e830: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
e840: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
e850: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
e860: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
e870: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
e880: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
e890: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
e8a0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
e8b0: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
e8c0: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
e8d0: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
e8e0: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
e8f0: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
e900: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
e910: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
e920: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
e930: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
e940: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
e950: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
e960: 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
e970: 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
e980: 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
e990: 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
e9a0: 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
e9b0: 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
e9c0: 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
e9d0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
e9e0: 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
e9f0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
ea00: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
ea10: 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
ea20: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
ea30: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
ea40: 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
ea50: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
ea60: 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
ea70: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
ea80: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
ea90: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
eaa0: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
eab0: 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
eac0: 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
ead0: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
eae0: 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
eaf0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
eb00: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
eb10: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
eb20: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
eb30: 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
eb40: 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
eb50: 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
eb60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
eb70: 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
eb80: 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
eb90: 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
eba0: 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
ebb0: 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
ebc0: 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
ebd0: 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
ebe0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
ebf0: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
ec00: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
ec10: 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
ec20: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
ec30: 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
ec40: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
ec50: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
ec60: 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54   pgno);.  PAGERT
ec70: 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
ec80: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
ec90: 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
ecb0: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
ecc0: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
ecd0: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
ece0: 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20  ze, aData),.    
ecf0: 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
ed00: 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
ed10: 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
ed20: 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
ed30: 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
ed40: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
ed50: 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20  ).   && (pPg==0 
ed60: 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
ed70: 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
ed80: 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  C)).   && isOpen
ed90: 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
eda0: 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20 29  && !isUnsync.  )
edb0: 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
edc0: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
edd0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
ede0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
edf0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
ee00: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
ee10: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
ee20: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
ee30: 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
ee40: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
ee50: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
ee60: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
ee70: 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
ee80: 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
ee90: 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 61 44  Backup, pgno, aD
eea0: 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ata);.  }else if
eeb0: 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
eec0: 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
eed0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
eee0: 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
eef0: 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
ef00: 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
ef10: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
ef20: 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
ef30: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
ef40: 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
ef50: 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
ef60: 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
ef70: 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
ef80: 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
ef90: 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
efa0: 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
efb0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
efc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
efd0: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
efe0: 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
eff0: 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
f000: 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
f010: 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
f020: 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
f030: 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
f040: 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
f050: 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
f060: 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
f070: 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
f080: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
f090: 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
f0a0: 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
f0b0: 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
f0c0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
f0d0: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
f0e0: 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
f0f0: 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
f100: 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
f110: 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
f120: 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
f130: 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
f140: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
f150: 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
f160: 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
f170: 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
f180: 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
f190: 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
f1a0: 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
f1b0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
f1c0: 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
f1d0: 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
f1e0: 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
f1f0: 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
f200: 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
f210: 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
f220: 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
f230: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
f240: 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
f250: 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c     if( (rc = sql
f260: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
f270: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
f280: 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  pPg, 1))!=SQLITE
f290: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
f2a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
f2b0: 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
f2c0: 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
f2d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
f2e0: 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
f2f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
f300: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
f310: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
f320: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
f330: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
f340: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
f350: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
f360: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
f370: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
f380: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
f390: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
f3a0: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
f3b0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
f3c0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
f3d0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
f3e0: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
f3f0: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
f400: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
f410: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
f420: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
f430: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
f440: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
f450: 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
f460: 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
f470: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
f480: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
f490: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
f4a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
f4b0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
f4c0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
f4d0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
f4e0: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
f4f0: 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
f500: 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
f510: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
f520: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
f530: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
f540: 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
f550: 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
f560: 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
f570: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
f580: 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
f590: 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
f5a0: 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
f5b0: 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
f5c0: 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
f5d0: 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
f5e0: 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
f5f0: 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
f600: 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
f610: 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
f620: 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
f630: 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
f640: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
f650: 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65   ** There is one
f660: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
f670: 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20  is rule. If the 
f680: 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f  page is being ro
f690: 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  lled.      ** ba
f6a0: 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ck as part of a 
f6b0: 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74  savepoint (or st
f6c0: 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63  atement) rollbac
f6d0: 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20  k from an .     
f6e0: 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   ** unsynced por
f6f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e  tion of the main
f700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
f710: 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hen it is not sa
f720: 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  fe.      ** to m
f730: 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
f740: 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62  clean. This is b
f750: 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74  ecause marking t
f760: 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20  he page as.     
f770: 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63   ** clean will c
f780: 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
f790: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53  EED_SYNC flag. S
f7a0: 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73  ince the page is
f7b0: 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
f7c0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
f7d0: 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20   file (recorded 
f7e0: 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
f7f0: 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  nal) and.      *
f800: 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
f810: 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c  _SYNC flag is cl
f820: 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61  eared, if the pa
f830: 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ge is written to
f840: 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
f850: 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
f860: 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  saction, it will
f870: 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
f880: 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  rty but.      **
f890: 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
f8a0: 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e  SYNC flag will n
f8b0: 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f  ot be set. It co
f8c0: 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69  uld then potenti
f8d0: 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65  ally.      ** be
f8e0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74   written out int
f8f0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
f900: 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a  ile before its j
f910: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
f920: 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20    ** segment is 
f930: 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61  synced. If a cra
f940: 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  sh occurs during
f950: 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   or following th
f960: 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  is,.      ** dat
f970: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
f980: 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20   may ensue..    
f990: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
f9a0: 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
f9b0: 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69  n(pPg);.    }.#i
f9c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
f9d0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
f9e0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
f9f0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
fa00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49  .#endif.    /* I
fa10: 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
fa20: 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
fa30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
fa40: 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
fa50: 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
fa60: 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
fa70: 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
fa80: 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
fa90: 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
faa0: 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
fab0: 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
fac0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
fad0: 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
fae0: 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
faf0: 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
fb00: 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
fb10: 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
fb20: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
fb30: 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69  no, 3);.    sqli
fb40: 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
fb50: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
fb60: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21  urn rc;.}..#if !
fb70: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
fb80: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
fb90: 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
fba0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
fbb0: 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65 61 64 20  ine looks ahead 
fbc0: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
fbd0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 64  urnal file and d
fbe0: 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 65  etermines.** whe
fbf0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
fc00: 6e 65 78 74 20 72 65 63 6f 72 64 20 28 74 68 65  next record (the
fc10: 20 72 65 63 6f 72 64 20 74 68 61 74 20 62 65 67   record that beg
fc20: 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a 2a 20 6f  ins at file.** o
fc30: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 6a 6f  ffset pPager->jo
fc40: 75 72 6e 61 6c 4f 66 66 29 20 69 73 20 61 20 77  urnalOff) is a w
fc50: 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 67 65 20  ell-formed page 
fc60: 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 69 6e  record consistin
fc70: 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c 69 64 20  g.** of a valid 
fc80: 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 70 50 61  page number, pPa
fc90: 67 65 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  ge->pageSize byt
fca0: 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2c 20 66  es of content, f
fcb0: 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20 61 20  ollowed.** by a 
fcc0: 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d 2e 0a  valid checksum..
fcd0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
fce0: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 6b  never needs to k
fcf0: 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f 72 64 65  now this in orde
fd00: 72 20 74 6f 20 64 6f 20 69 74 73 20 6a 6f 62 2e  r to do its job.
fd10: 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69     This.** routi
fd20: 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ne is only used 
fd30: 66 72 6f 6d 20 77 69 74 68 20 61 73 73 65 72 74  from with assert
fd40: 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
fd50: 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 73 74 61  ) macros..*/.sta
fd60: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4e 65 78  tic int pagerNex
fd70: 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61  tJournalPageIsVa
fd80: 6c 69 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  lid(Pager *pPage
fd90: 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
fda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fdb0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
fdc0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
fdd0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
fde0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
fdf0: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
fe00: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
fe10: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
fe20: 65 20 66 72 6f 6d 20 72 65 61 64 20 6f 70 65 72  e from read oper
fe30: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  ations */.  sqli
fe40: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
fe50: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
fe60: 63 72 69 70 74 6f 72 20 66 72 6f 6d 20 77 68 69  criptor from whi
fe70: 63 68 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ch we are readin
fe80: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
fe90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
fea0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
feb0: 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ge */..  /* Read
fec0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
fed0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 66 64 20   header */.  fd 
fee0: 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b 0a 20  = pPager->jfd;. 
fef0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
ff00: 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  (fd, pPager->jou
ff10: 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e 6f 29 3b  rnalOff, &pgno);
ff20: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ff30: 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30  E_OK ){ return 0
ff40: 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
ff70: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
ff80: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
ff90: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
ffa0: 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
ffb0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
ffc0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
ffd0: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
ffe0: 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
10010 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
10020 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72 63  checksum */.  rc
10030 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 64   = read32bits(fd
10040 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
10050 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  lOff+pPager->pag
10060 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29  eSize+4, &cksum)
10070 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10080 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20  TE_OK ){ return 
10090 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0; }            
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
100c0 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
100d0 20 64 61 74 61 20 61 6e 64 20 76 65 72 69 66 79   data and verify
100e0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f   the checksum */
100f0 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38 2a 29  .  aData = (u8*)
10100 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
10110 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
10120 33 4f 73 52 65 61 64 28 66 64 2c 20 61 44 61 74  3OsRead(fd, aDat
10130 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
10140 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ize, pPager->jou
10150 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20 20 69 66  rnalOff+4);.  if
10160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10170 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66  /*NO_TEST*/.  if
101b0 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
101c0 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
101d0 73 75 6d 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  sum ){ return 0;
101e0 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
101f0 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f  /*NO_TEST*/..  /
10200 2a 20 52 65 61 63 68 20 74 68 69 73 20 70 6f 69  * Reach this poi
10210 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 70  nt only if the p
10220 61 67 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  age is valid */.
10230 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
10240 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10250 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
10260 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
10270 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 2f 2a  AGE_TEST) */../*
10280 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
10290 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
102a0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
102b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
102c0 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
102d0 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
102e0 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
102f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
10300 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
10310 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
10320 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
10330 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
10340 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
10350 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10360 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
10370 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
10380 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
10390 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
103a0 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
103b0 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
103c0 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
103d0 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
103e0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
103f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ion..**.** When 
10400 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10410 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
10420 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65  , it is populate
10430 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73  d with the names
10440 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69   .** of all of i
10450 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ts child journal
10460 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f  s, one after ano
10470 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20  ther, formatted 
10480 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63  as utf-8 .** enc
10490 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65  oded text. The e
104a0 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64  nd of each child
104b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
104c0 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a   marked with a .
104d0 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
104e0 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69  r byte (0x00). i
104f0 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63  .e. the entire c
10500 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73  ontents of a mas
10510 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  ter journal.** f
10520 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61  ile for a transa
10530 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20  ction involving 
10540 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69  two databases mi
10550 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ght be:.**.**   
10560 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62  "/home/bill/a.db
10570 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d  -journal\x00/hom
10580 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72  e/bill/b.db-jour
10590 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41  nal\x00".**.** A
105a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
105b0 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  file may only be
105c0 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c   deleted once al
105d0 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a  l of its child .
105e0 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65  ** journals have
105f0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
10600 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
10610 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65  nction reads the
10620 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
10630 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10640 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65  file into .** me
10650 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74  mory and loops t
10660 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74  hrough each of t
10670 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
10680 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65   names. For.** e
10690 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
106a0 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a  l, it checks if:
106b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68  .**.**   * if th
106c0 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
106d0 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73  exists, and if s
106e0 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  o.**   * if the 
106f0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f  child journal co
10700 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e  ntains a referen
10710 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ce to master jou
10720 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c  rnal .**     fil
10730 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  e zMaster.**.** 
10740 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e  If a child journ
10750 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  al can be found 
10760 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74  that matches bot
10770 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69  h of the criteri
10780 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73  a.** above, this
10790 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
107a0 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  s without doing 
107b0 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77  anything. Otherw
107c0 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75  ise, if.** no su
107d0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
107e0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66   can be found, f
107f0 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64  ile zMaster is d
10800 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  eleted from.** t
10810 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75  he file-system u
10820 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
10830 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  lete()..**.** If
10840 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74   an IO error wit
10850 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
10860 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  n, an error code
10870 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
10880 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
10890 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20  llocates memory 
108a0 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
108b0 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61  e3Malloc(). If a
108c0 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  n allocation.** 
108d0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
108e0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
108f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
10900 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65  o IO or malloc e
10910 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c  rrors .** occur,
10920 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
10930 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  turned..**.** TO
10940 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  DO: This functio
10950 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69  n allocates a si
10960 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65  ngle block of me
10970 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  mory to load.** 
10980 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
10990 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
109a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
109b0 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  This could be.**
109c0 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c   a couple of kil
109d0 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70  obytes or so - p
109e0 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65  otentially large
109f0 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
10a00 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  .** size..*/.sta
10a10 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
10a20 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
10a30 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
10a40 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
10a50 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
10a60 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
10a70 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a90 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10aa0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
10ab0 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61  Master;    /* Ma
10ac0 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f  lloc'd master-jo
10ad0 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
10ae0 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
10af0 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
10b00 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  l;   /* Malloc'd
10b10 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66   child-journal f
10b20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
10b30 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
10b40 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
10b50 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
10b60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10b70 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
10b80 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
10b90 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
10ba0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
10bb0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
10bc0 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
10bd0 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
10be0 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
10bf0 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
10c00 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
10c10 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
10c20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
10c30 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
10c40 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
10c50 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
10c60 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
10c70 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
10c80 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
10c90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
10ca0 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
10cb0 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
10cc0 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
10cd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10ce0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
10cf0 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
10d00 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
10d10 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
10d20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
10d30 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
10d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
10d50 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
10d60 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
10d70 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
10d80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10d90 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10da0 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  out;..  rc = sql
10db0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
10dc0 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
10dd0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
10de0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_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 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
10e10 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
10e20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
10e30 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
10e40 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
10e50 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
10e60 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
10e70 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  me+1;..    /* Lo
10e80 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
10e90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10ea0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
10eb0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
10ec0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
10ed0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
10ee0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
10ef0 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
10f00 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
10f10 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
10f20 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61  3Malloc((int)nMa
10f30 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
10f40 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69  asterPtr);.    i
10f50 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
10f60 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
10f70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10f80 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10f90 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
10fa0 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20     zMasterPtr = 
10fb0 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
10fc0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b  nMasterJournal];
10fd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10fe0 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
10ff0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
11000 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
11010 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  rnal, 0);.    if
11020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11030 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
11040 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
11050 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
11060 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
11070 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
11080 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
11090 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
110a0 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
110b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
110c0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
110d0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
110e0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
110f0 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  &exists);.      
11100 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11110 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
11120 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11140 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
11150 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
11160 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
11170 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
11180 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
11190 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
111a0 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
111b0 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
111c0 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
111d0 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
111e0 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
111f0 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
11200 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11210 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
11220 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
11230 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  c;.        int f
11240 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
11250 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
11260 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
11270 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
11280 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
11290 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
112a0 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
112b0 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  gs, 0);.        
112c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
112d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
112e0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
112f0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
11300 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
11310 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
11320 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
11330 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
11340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
11350 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
11360 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11370 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11380 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
11390 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
113a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
113b0 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
113c0 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
113d0 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
113e0 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
113f0 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
11400 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
11410 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
11420 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
11430 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
11440 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11450 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
11460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11470 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
11480 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
11490 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
114a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
114b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
114c0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
114d0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
114e0 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
114f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
11500 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
11510 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
11520 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 70  );.  }  .  if( p
11530 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
11540 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
11550 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
11560 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
11570 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71  nal) );.  }.  sq
11580 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
11590 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
115a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
115b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
115c0 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
115d0 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
115e0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
115f0 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
11600 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e  -system. This on
11610 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
11620 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
11630 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20  nsaction,.** or 
11640 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74  rolling back a t
11650 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c  ransaction (incl
11660 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61  uding rolling ba
11670 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
11680 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
11690 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
116a0 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
116b0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
116c0 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 68  lock is not.** h
116d0 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
116e0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
116f0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69  therwise, the si
11700 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
11710 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20  s.** changed to 
11720 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
11730 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
11740 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20 74  ize bytes). If t
11750 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69  he file.** on di
11760 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  sk is currently 
11770 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67  larger than nPag
11780 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73  e pages, then us
11790 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72  e the VFS.** xTr
117a0 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20  uncate() method 
117b0 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a  to truncate it..
117c0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67  **.** Or, it mig
117d0 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  ht might be the 
117e0 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
117f0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
11800 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e  aller than .** n
11810 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65  Page pages. Some
11820 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
11830 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
11840 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
11850 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72  ed if .** you tr
11860 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20  y to truncate a 
11870 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
11880 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
11890 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72   than it .** cur
118a0 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65  rently is, so de
118b0 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
118c0 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
118d0 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a  e zero byte to .
118e0 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
118f0 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65  e new file inste
11900 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ad..**.** If suc
11910 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
11920 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
11930 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
11940 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67   while modifying
11950 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
11960 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68   file, return th
11970 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
11980 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
11990 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
119a0 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
119b0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
119c0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
119d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
119e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
119f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
11a00 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
11a10 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36 34  ->fd) ){.    i64
11a20 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
11a30 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54 4f  wSize;.    /* TO
11a40 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
11a50 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
11a60 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
11a70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11a80 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
11a90 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
11aa0 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
11ab0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
11ac0 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Size*(i64)nPage;
11ad0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11ae0 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
11af0 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
11b00 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
11b10 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
11b20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11b30 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11b40 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
11b50 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
11b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
11b70 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
11b80 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c  (pPager->fd, "",
11b90 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a   1, newSize-1);.
11ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11bb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11bc0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
11bd0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
11be0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
11bf0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11c00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
11c10 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
11c20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
11c30 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
11c40 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
11c50 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
11c60 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
11c70 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
11c80 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
11c90 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
11ca0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
11cb0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
11cc0 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74   used used .** t
11cd0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
11ce0 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65  size and alignme
11cf0 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  nt of journal he
11d00 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73  ader and .** mas
11d10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
11d20 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61  ters within crea
11d30 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
11d40 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
11d50 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65  porary files the
11d60 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
11d70 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73  r size is always
11d80 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a   512 bytes..**.*
11d90 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  * Otherwise, for
11da0 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66   non-temporary f
11db0 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74  iles, the effect
11dc0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
11dd0 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  is.** the value 
11de0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
11df0 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65  xSectorSize() me
11e00 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20  thod rounded up 
11e10 74 6f 20 35 31 32 20 69 66 0a 2a 2a 20 69 74 20  to 512 if.** it 
11e20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 35 31 32  is less than 512
11e30 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
11e40 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
11e50 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
11e60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
11e70 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
11e80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
11e90 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
11ea0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
11eb0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
11ec0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
11ed0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
11ee0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
11ef0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
11f00 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
11f10 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
11f20 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
11f30 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
11f40 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
11f50 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
11f60 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
11f70 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
11f80 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
11f90 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
11fa0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
11fb0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
11fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
11fd0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
11fe0 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
11ff0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12000 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61 67  <512 ){.    pPag
12010 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
12020 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   512;.  }.  if( 
12030 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12040 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
12050 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
12060 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
12070 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50  E>=512 );.    pP
12080 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12090 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
120a0 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ZE;.  }.}../*.**
120b0 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
120c0 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
120d0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
120e0 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
120f0 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
12100 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
12110 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
12120 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
12130 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
12140 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
12150 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
12160 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
12170 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
12180 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
12190 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
121a0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
121b0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
121c0 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
121d0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
121e0 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
121f0 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
12200 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
12210 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
12220 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
12230 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
12240 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
12250 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
12260 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
12270 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
12280 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
12290 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
122a0 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
122b0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
122c0 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
122d0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
122e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
122f0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
12300 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
12310 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
12320 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
12330 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
12340 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12350 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
12360 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
12370 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
12380 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
12390 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
123a0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
123b0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
123c0 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a  the page case..*
123d0 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20 69  *  (7)  4 byte i
123e0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
123f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
12400 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
12410 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
12420 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
12430 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
12440 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
12450 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
12460 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
12470 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20  al.).**  (8)  N 
12480 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
12490 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
124a0 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
124b0 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
124c0 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
124d0 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
124e0 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
124f0 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
12500 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
12510 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
12520 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
12530 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
12540 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
12550 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
12560 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
12570 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
12580 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a  TF-8..**  (9)  Z
12590 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
125a0 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
125b0 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
125c0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
125d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
125e0 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
125f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
12600 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
12610 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
12620 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
12630 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
12640 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
12650 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
12660 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61 62  first 8 items ab
12670 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
12680 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
12690 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
126a0 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65 6d   of the 9th item
126b0 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
126c0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
126d0 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
126e0 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
126f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
12700 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
12710 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
12720 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
12730 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
12740 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
12750 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
12760 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
12770 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
12780 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
12790 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
127a0 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
127b0 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
127c0 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
127d0 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
127e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
127f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
12800 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
12810 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
12820 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
12830 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
12840 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
12850 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
12860 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
12870 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
12880 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
12890 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
128a0 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
128b0 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
128c0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
128d0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
128e0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
128f0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
12900 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
12910 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
12920 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
12930 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
12940 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
12950 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
12960 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
12970 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
12980 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
12990 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
129a0 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
129b0 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
129c0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
129d0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
129e0 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
129f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12a00 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
12a10 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
12a20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
12a30 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
12a40 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
12a50 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
12a60 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
12a70 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
12a80 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
12a90 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
12aa0 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
12ab0 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
12ac0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
12ad0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
12ae0 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
12af0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
12b00 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
12b10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
12b20 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
12b30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
12b40 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
12b50 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
12b60 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
12b70 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
12b80 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
12b90 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
12ba0 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
12bb0 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
12bc0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
12bd0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
12be0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
12bf0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
12c00 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
12c10 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
12c20 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
12c30 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
12c40 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
12c50 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
12c60 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
12c70 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
12c80 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
12c90 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
12ca0 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
12cb0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
12cc0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12cd0 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
12ce0 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
12cf0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
12d00 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
12d10 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
12d20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
12d30 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
12d40 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
12d50 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
12d60 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
12d70 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
12d80 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
12d90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12da0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
12db0 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12dd0 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
12de0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
12df0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
12e20 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
12e30 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
12e60 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
12e70 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
12e80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12e90 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
12ea0 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
12eb0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ed0 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
12ee0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
12ef0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
12f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
12f10 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
12f20 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
12f30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
12f40 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
12f50 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
12f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
12f70 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
12f80 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
12f90 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
12fa0 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
12fb0 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
12fc0 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46  lback */..  /* F
12fd0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
12fe0 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
12ff0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
13000 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
13010 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
13020 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
13030 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
13040 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
13050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13060 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
13070 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
13080 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13090 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
130a0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
130b0 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
130c0 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
130d0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
130e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
130f0 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
13100 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
13110 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
13120 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
13130 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
13140 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
13150 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
13160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
13170 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
13180 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
13190 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
131a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
131b0 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
131c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
131d0 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
131e0 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
131f0 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
13200 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
13210 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
13220 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
13230 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
13240 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
13250 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
13260 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
13270 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
13280 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65    **  mxPathname
13290 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69   is 512, which i
132a0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
132b0 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61  e minimum allowa
132c0 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66  ble value.  ** f
132d0 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a  or pageSize..  *
132e0 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
132f0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
13300 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
13310 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
13320 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
13330 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
13340 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
13350 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13360 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
13370 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
13380 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
13390 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
133a0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
133b0 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
133c0 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
133d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
133e0 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
133f0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
13400 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
13410 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13420 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
13430 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68   isHot;..  /* Th
13440 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
13450 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61  es either when a
13460 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
13470 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72  ) or .  ** pager
13480 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
13490 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ge() call return
134a0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
134b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20   an IO error .  
134c0 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f  ** occurs. .  */
134d0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
134e0 20 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 20     int isUnsync 
134f0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  = 0;..    /* Rea
13500 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
13510 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
13520 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13530 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
13540 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
13550 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
13560 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13570 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
13580 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
13590 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
135a0 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
135b0 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
135c0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
135d0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
135e0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
135f0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
13600 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
13610 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
13620 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
13630 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
13640 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
13650 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13660 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
13670 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
13680 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13690 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
136a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
136b0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
136c0 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
136d0 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
136e0 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
136f0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
13700 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
13710 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
13720 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
13730 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
13740 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
13750 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
13760 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
13770 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
13780 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
13790 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
137a0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
137b0 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
137c0 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
137d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
137e0 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
137f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13800 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13810 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
13820 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
13830 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
13840 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
13850 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
13860 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
13870 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
13880 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
13890 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
138a0 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
138b0 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
138c0 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
138d0 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
138e0 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
138f0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
13900 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
13910 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
13920 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
13930 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
13940 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
13950 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
13960 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
13970 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
13980 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
13990 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
139a0 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
139b0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
139c0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
139d0 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
139e0 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
139f0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
13a00 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
13a10 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
13a20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
13a30 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
13a40 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
13a50 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
13a60 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
13a70 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
13a80 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
13a90 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
13aa0 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
13ab0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
13ac0 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
13ad0 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
13ae0 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
13af0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
13b00 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
13b10 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
13b20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
13b30 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
13b40 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
13b50 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
13b60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
13b70 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
13b80 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
13b90 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
13ba0 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
13bb0 20 20 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61     */.    testca
13bc0 73 65 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  se( nRec==0 && !
13bd0 69 73 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26  isHot.         &
13be0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
13bf0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
13c00 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61  _SZ(pPager)!=pPa
13c10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
13c20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a           && ((sz
13c30 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
13c40 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
13c50 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
13c60 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  >0.         && p
13c70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50  agerNextJournalP
13c80 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65  ageIsValid(pPage
13c90 72 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  r).    );.    if
13ca0 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
13cb0 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
13cc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
13cd0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
13ce0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
13cf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
13d00 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
13d10 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
13d20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
13d30 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
13d40 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 73  ager));.      is
13d50 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  Unsync = 1;.    
13d60 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
13d70 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
13d80 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
13d90 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
13da0 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
13db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
13dc0 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
13dd0 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
13de0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
13df0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
13e00 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
13e10 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
13e20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
13e30 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
13e40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13e50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13e60 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
13e70 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
13e80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
13e90 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
13ea0 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
13eb0 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
13ec0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13ed0 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
13ee0 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
13ef0 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
13f00 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
13f10 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
13f20 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
13f30 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
13f40 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
13f50 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
13f60 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
13f70 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
13f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13f90 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
13fa0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
13fb0 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63 2c 26  ger,1,isUnsync,&
13fc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13fd0 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 69  ff,0,0);.      i
13fe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14000 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
14010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
14020 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14030 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
14040 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
14050 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
14060 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14070 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
14080 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
14090 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  o rollback, then
140a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
140b0 20 70 72 6f 62 61 62 6c 79 0a 20 20 20 20 20 20   probably.      
140c0 20 20 20 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20      ** going to 
140d0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 63 6f 72  end up being cor
140e0 72 75 70 74 2e 20 20 49 74 20 69 73 20 63 6f 72  rupt.  It is cor
140f0 72 75 70 74 20 74 6f 20 75 73 2c 20 61 6e 79 68  rupt to us, anyh
14100 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ow..          **
14110 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
14120 74 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d  t process to com
14130 65 20 61 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20  e along can fix 
14140 69 74 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20  it.....         
14150 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
14160 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
14170 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
14180 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14190 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
141a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
141b0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
141c0 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
141d0 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
141e0 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
141f0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
14200 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
14210 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
14220 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
14230 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
14240 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
14250 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
14260 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
14270 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
14280 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
14290 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
142a0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
142b0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
142c0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
142d0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
142e0 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  dified..  */.  a
142f0 73 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65  ssert(.    pPage
14300 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d  r->fd->pMethods=
14310 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65  =0 ||.    sqlite
14320 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
14330 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
14340 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
14350 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f  GED,0)>=SQLITE_O
14360 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  K.  );..  /* If 
14370 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
14380 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
14390 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
143a0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
143b0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
143c0 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
143d0 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
143e0 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
143f0 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
14400 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
14410 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
14420 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
14430 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
14440 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
14450 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
14460 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
14470 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
14480 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
14490 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
144a0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
144b0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
144c0 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
144d0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
144e0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
144f0 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
14500 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
14510 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
14520 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
14530 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
14540 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
14550 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
14560 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
14570 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
14580 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
14590 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
145a0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
145b0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
145c0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
145d0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
145e0 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
145f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14600 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
14610 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
14620 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
14630 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
14640 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
14650 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
14660 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
14670 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14680 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
14690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
146a0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
146b0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
146c0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
146d0 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
146e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
146f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14700 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14710 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
14720 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
14730 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
14740 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
14750 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
14760 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
14770 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
14780 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
14790 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
147a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
147b0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
147c0 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
147d0 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
147e0 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
147f0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14800 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
14810 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
14820 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
14830 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
14840 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
14850 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
14860 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
14870 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
14880 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
14890 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
148a0 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
148b0 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
148c0 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
148d0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
148e0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
148f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14900 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
14910 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
14920 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
14930 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
14940 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
14950 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
14960 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
14970 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
14980 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
14990 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
149a0 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
149b0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
149c0 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
149d0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
149e0 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
149f0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
14a00 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
14a10 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
14a20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
14a30 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
14a40 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
14a50 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
14a60 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
14a70 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
14a80 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
14a90 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
14aa0 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
14ab0 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
14ac0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14ad0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
14ae0 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
14af0 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
14b00 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
14b10 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
14b20 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
14b30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14b40 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
14b50 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14b60 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
14b70 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
14b80 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14b90 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
14ba0 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
14bb0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14bc0 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
14bd0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
14be0 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
14bf0 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
14c00 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
14c10 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
14c20 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
14c30 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
14c40 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
14c50 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14c60 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
14c70 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
14c80 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
14c90 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14ca0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
14cb0 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
14cc0 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
14cd0 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
14ce0 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
14cf0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
14d00 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
14d10 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
14d20 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
14d30 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
14d40 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
14d50 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
14d60 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
14d70 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
14d80 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
14d90 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
14da0 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
14db0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
14dc0 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
14dd0 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
14de0 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
14df0 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
14e00 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
14e10 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
14e20 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
14e30 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
14e40 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
14e50 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
14e60 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
14e70 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
14e80 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
14e90 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
14ea0 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
14eb0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
14ec0 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
14ed0 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
14ee0 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
14ef0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
14f00 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
14f10 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
14f20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
14f30 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
14f40 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
14f50 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
14f60 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
14f70 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
14f80 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
14f90 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
14fa0 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
14fb0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
14fc0 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
14fd0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14fe0 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
14ff0 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
15000 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
15010 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
15020 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15040 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
15050 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
15060 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
15070 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
15080 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
15090 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
150a0 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
150b0 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
150c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
150d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
150e0 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
150f0 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
15100 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
15110 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
15120 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
15130 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
15140 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
15150 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
15160 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
15170 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
15180 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
15190 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
151a0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
151b0 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
151c0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
151d0 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
151e0 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
151f0 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
15200 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15210 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
15220 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
15230 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
15240 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
15250 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
15260 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
15270 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
15280 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
15290 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
152a0 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
152b0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
152c0 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
152d0 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  OrigSize;..  /* 
152e0 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
152f0 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
15300 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
15310 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
15320 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
15330 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
15340 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
15350 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
15360 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
15370 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
15380 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
15390 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
153a0 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
153b0 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
153c0 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
153d0 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
153e0 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
153f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
15400 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
15410 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
15420 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15430 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
15440 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
15450 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
15460 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
15470 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
15480 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
15490 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
154a0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
154b0 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
154c0 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
154d0 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
154e0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
154f0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
15500 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
15510 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
15520 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
15530 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
15540 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
15550 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
15560 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
15570 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
15580 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
15590 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
155a0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
155b0 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
155c0 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
155d0 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
155e0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
155f0 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
15600 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
15610 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15620 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
15630 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
15640 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
15650 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
15660 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61  ager, 1, 0, &pPa
15670 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
15680 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20   1, pDone);.    
15690 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
156a0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
156b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
156c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
156d0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
156e0 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
156f0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
15700 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
15710 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
15720 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
15730 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15740 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
15750 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
15760 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
15770 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
15780 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
15790 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
157a0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
157b0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
157c0 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
157d0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
157e0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
157f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15800 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15810 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
15820 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
15830 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15840 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
15850 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
15860 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
15870 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
15880 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
15890 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
158a0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
158b0 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
158c0 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
158d0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
158e0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
158f0 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
15900 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
15910 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
15920 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
15930 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
15940 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
15950 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
15960 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
15970 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
15980 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
15990 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
159a0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
159b0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
159c0 20 61 73 73 65 72 74 28 20 21 28 6e 4a 52 65 63   assert( !(nJRec
159d0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
159e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
159f0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
15a00 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67 65  Z(pPager)!=pPage
15a10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
15a20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a 20         && ((szJ 
15a30 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
15a40 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
15a50 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e 30  PG_SZ(pPager))>0
15a60 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61 67  .         && pag
15a70 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67  erNextJournalPag
15a80 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72 29  eIsValid(pPager)
15a90 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
15aa0 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20   nJRec==0 .     
15ab0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15ac0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
15ad0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
15ae0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15af0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a  .    ){.      nJ
15b00 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a  Rec = (u32)((szJ
15b10 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
15b20 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50  alOff)/JOURNAL_P
15b30 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
15b40 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
15b50 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
15b60 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20   && ii<nJRec && 
15b70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15b80 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20  ff<szJ; ii++){. 
15b90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
15ba0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
15bb0 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20  e(pPager, 1, 0, 
15bc0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
15bd0 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  Off, 1, pDone);.
15be0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
15bf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
15c00 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
15c10 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
15c20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
15c30 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a  nalOff==szJ );..
15c40 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
15c50 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
15c60 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
15c70 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
15c80 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
15c90 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
15ca0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
15cb0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
15cc0 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
15cd0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
15ce0 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
15cf0 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
15d00 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
15d10 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
15d20 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
15d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15d40 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15d50 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
15d60 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75   pSavepoint->iSu
15d70 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
15d80 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66  pageSize);.    f
15d90 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74  or(ii=pSavepoint
15da0 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53  ->iSubRec; rc==S
15db0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70  QLITE_OK && ii<p
15dc0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20  Pager->nSubRec; 
15dd0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
15de0 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a  ert( offset==ii*
15df0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
15e00 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
15e10 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
15e20 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
15e30 72 2c 20 30 2c 20 30 2c 20 26 6f 66 66 73 65 74  r, 0, 0, &offset
15e40 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20  , 1, pDone);.   
15e50 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
15e60 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
15e70 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
15e80 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
15e90 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
15ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15eb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15ec0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
15ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15ee0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15ef0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
15f00 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
15f10 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
15f20 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
15f30 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
15f40 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
15f50 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
15f60 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
15f70 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
15f80 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
15f90 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
15fa0 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
15fb0 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
15fc0 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
15fd0 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
15fe0 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
15ff0 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
16000 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
16010 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
16020 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
16030 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
16040 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
16050 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
16060 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
16070 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
16080 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
16090 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
160a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
160b0 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
160c0 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
160d0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
160e0 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
160f0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
16100 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
16110 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
16130 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
16140 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
16150 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
16160 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
16170 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
16180 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
16190 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
161a0 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
161b0 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
161c0 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
161d0 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
161e0 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
161f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16200 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
16210 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
16220 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
16230 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
16240 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
16250 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
16260 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
16270 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
16280 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
16290 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
162a0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
162b0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
162c0 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
162d0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
162e0 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
162f0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
16300 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
16310 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
16320 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
16330 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
16340 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
16350 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
16360 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
16370 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16380 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
16390 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
163a0 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
163b0 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
163c0 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
163d0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
163e0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
163f0 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
16410 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
16420 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
16430 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
16440 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
16450 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
16460 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
16470 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
16480 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
16490 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
164a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
164b0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
164c0 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
164d0 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
164e0 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
164f0 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
16500 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20   bFullFsync){.  
16510 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
16520 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
16530 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
16540 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
16550 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
16560 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
16570 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
16580 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
16590 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46  _flags = (bFullF
165a0 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
165b0 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
165c0 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28  C_NORMAL);.  if(
165d0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
165e0 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
165f0 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
16600 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
16610 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
16620 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
16630 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
16640 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
16650 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
16660 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
16670 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
16680 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
16690 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
166a0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
166b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
166c0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
166d0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
166e0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
166f0 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
16700 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
16710 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
16720 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
16730 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
16740 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
16750 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
16760 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
16770 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
16780 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
16790 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
167a0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
167b0 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
167c0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
167d0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
167e0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
167f0 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
16800 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
16810 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
16820 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
16830 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
16840 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
16850 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16860 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
16870 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
16880 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
16890 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
168a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
168b0 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
168c0 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
168d0 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
168e0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
168f0 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
16900 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
16910 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
16920 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
16930 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
16940 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
16950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
16960 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
16970 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
16980 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
16990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
169a0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
169b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
169c0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
169d0 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
169e0 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
169f0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
16a00 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
16a10 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
16a20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16a30 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
16a40 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
16a50 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16a60 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
16a70 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
16a80 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
16a90 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
16aa0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
16ab0 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
16ac0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
16ad0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
16ae0 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
16af0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16b00 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
16b10 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
16b20 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
16b30 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
16b40 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
16b50 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
16b60 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
16b70 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
16b80 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
16b90 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
16ba0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
16bb0 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
16bc0 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
16bd0 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
16be0 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
16bf0 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
16c00 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
16c10 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
16c20 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
16c30 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
16c40 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
16c50 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
16c60 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
16c70 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
16c80 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
16c90 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16ca0 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
16cb0 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
16cc0 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
16cd0 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
16ce0 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
16cf0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
16d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
16d30 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
16d40 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
16d50 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
16d60 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
16d70 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
16d80 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
16d90 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
16da0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
16db0 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
16dc0 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
16dd0 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
16de0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
16df0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
16e00 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
16e10 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
16e20 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
16e30 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
16e40 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
16e50 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
16e60 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
16e70 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
16e80 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
16e90 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
16ea0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
16eb0 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
16ec0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
16ef0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
16f00 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
16f10 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
16f20 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
16f30 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
16f40 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
16f50 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
16f60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
16f70 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
16f80 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
16f90 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78  ){  .  pPager->x
16fa0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
16fb0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
16fc0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
16fd0 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
16fe0 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  dlerArg;.}../*.*
16ff0 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
17000 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
17010 20 70 61 67 65 72 2e 20 49 66 20 6e 6f 74 20 4e   pager. If not N
17020 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
17030 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
17040 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
17050 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
17060 6e 20 63 61 63 68 65 20 69 73 20 6d 6f 64 69 66  n cache is modif
17070 69 65 64 20 28 72 65 73 74 6f 72 65 64 29 0a 2a  ied (restored).*
17080 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 74  * as part of a t
17090 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
170a0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
170b0 2e 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67  . The callback g
170c0 69 76 65 73 20 0a 2a 2a 20 68 69 67 68 65 72 2d  ives .** higher-
170d0 6c 65 76 65 6c 20 63 6f 64 65 20 61 6e 20 6f 70  level code an op
170e0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
170f0 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
17100 65 63 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20 61 67  ection to .** ag
17110 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
17120 74 6f 72 65 64 20 70 61 67 65 20 64 61 74 61 2e  tored page data.
17130 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17140 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
17150 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17160 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
17170 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70 50 61  DbPage*)){.  pPa
17180 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
17190 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
171a0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  ** Change the pa
171b0 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
171c0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
171d0 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73  . The new page s
171e0 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65  ize .** is passe
171f0 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e  d in *pPageSize.
17200 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
17210 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
17220 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
17230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17240 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73  called, it.** is
17250 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61   a no-op. The va
17260 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
17270 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
17280 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
17290 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49   .** one of SQLI
172a0 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
172b0 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49  _CORRUPT or SQLI
172c0 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
172d0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
172e0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
172f0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
17300 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
17310 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
17320 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
17330 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
17340 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
17350 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
17360 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
17370 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
17380 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
17390 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
173a0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
173b0 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
173c0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
173d0 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
173e0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
173f0 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
17400 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
17410 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
17420 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
17430 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
17440 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
17450 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
17460 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
17470 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
17480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
17490 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
174a0 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
174b0 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
174c0 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
174d0 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
174e0 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
174f0 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
17500 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
17510 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
17520 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
17530 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
17540 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
17550 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
17560 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
17570 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
17580 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
17590 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
175a0 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
175b0 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
175c0 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
175d0 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
175e0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
175f0 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
17600 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
17610 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
17620 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
17630 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
17640 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
17650 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
17660 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
17670 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
17680 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
17690 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
176a0 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
176b0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
176c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
176d0 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
176e0 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61  pPager, u16 *pPa
176f0 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  geSize){.  int r
17700 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
17710 6f 64 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ode;.  if( rc==S
17720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17730 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u16 pageSize = *
17740 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  pPageSize;.    a
17750 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
17760 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
17770 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
17780 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
17790 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69  E_SIZE) );.    i
177a0 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  f( pageSize && p
177b0 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
177c0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20  >pageSize .     
177d0 26 26 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && (pPager->memD
177e0 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
177f0 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20  dbSize==0).     
17800 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
17810 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
17820 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
17830 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20    ){.      char 
17840 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29  *pNew = (char *)
17850 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
17860 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
17870 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a     if( !pNew ){.
17880 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17890 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
178a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
178b0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
178c0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
178d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
178e0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
178f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
17900 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
17910 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ace);.        pP
17920 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
17930 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
17940 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
17950 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
17960 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
17970 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
17980 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a   }.    *pPageSiz
17990 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  e = (u16)pPager-
179a0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  >pageSize;.  }. 
179b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
179c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
179d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
179e0 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
179f0 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
17a00 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
17a10 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
17a20 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
17a30 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
17a40 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
17a50 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
17a60 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
17a70 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
17a80 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
17a90 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
17aa0 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
17ab0 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
17ac0 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
17ad0 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
17ae0 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
17af0 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
17b00 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
17b10 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
17b20 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
17b30 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
17b40 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
17b50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
17b60 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
17b70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
17b80 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
17b90 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
17ba0 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
17bb0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
17bc0 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
17bd0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
17be0 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
17bf0 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
17c00 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
17c10 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
17c20 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
17c30 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
17c40 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
17c50 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
17c60 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
17c70 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
17c80 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
17c90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
17ca0 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
17cb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
17cc0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
17cd0 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
17ce0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
17cf0 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
17d00 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
17d10 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
17d20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
17d30 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
17d40 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
17d50 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
17d60 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
17d70 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
17d80 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
17d90 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
17da0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
17db0 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
17dc0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
17dd0 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
17de0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
17df0 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
17e00 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
17e10 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
17e20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
17e30 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
17e40 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
17e50 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
17e60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
17e70 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
17e80 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
17e90 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
17ea0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
17eb0 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
17ec0 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
17ed0 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
17ee0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
17ef0 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
17f00 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
17f10 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
17f20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
17f30 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
17f40 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
17f50 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
17f60 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
17f70 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
17f80 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
17f90 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
17fa0 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
17fb0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
17fc0 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
17fd0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
17fe0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
17ff0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
18000 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
18010 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18020 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
18030 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
18040 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
18050 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
18060 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
18070 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
18080 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
18090 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
180a0 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
180b0 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
180c0 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
180d0 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
180e0 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
180f0 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
18100 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
18110 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
18120 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
18130 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
18140 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
18150 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
18160 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
18170 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
18180 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
18190 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
181a0 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
181b0 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
181c0 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
181d0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
181e0 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
181f0 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
18200 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18210 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
18220 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
18230 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
18240 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
18250 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
18260 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
18270 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
18280 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
18290 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
182a0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
182b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
182c0 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
182d0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
182e0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
182f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
18300 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  e );.  if( isOpe
18310 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
18320 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
18330 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
18340 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
18350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
18360 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
18370 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
18380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18390 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
183a0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
183b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
183c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
183d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
183e0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
183f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
18400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18410 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
18420 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e 6f 72  with pPager. Nor
18430 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63  mally, this is c
18440 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28 3c 64  alculated as (<d
18450 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70 61  b file size>/<pa
18460 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f  ge-size>)..** Ho
18470 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
18480 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
18490 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
184a0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
184b0 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
184c0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
184d0 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  age file..**.** 
184e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
184f0 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
18500 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
18510 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
18520 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 73  n the.** error s
18530 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
18540 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
18550 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75 6e 63  *pnPage left unc
18560 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69  hanged. Or,.** i
18570 66 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  f the file syste
18580 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75 65 72  m has to be quer
18590 69 65 64 20 66 6f 72 20 74 68 65 20 73 69 7a 65  ied for the size
185a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
185b0 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20 61 74  .** the query at
185c0 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20 61 6e  tempt returns an
185d0 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65 20 49   IO error, the I
185e0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
185f0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
18600 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
18610 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
18620 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
18630 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
18640 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 53 51  cessful, then SQ
18650 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18660 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61  ned.** and *pnPa
18670 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ge is set to the
18680 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18690 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
186a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
186b0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
186c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
186d0 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  t *pnPage){.  Pg
186e0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
186f0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
18700 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
18710 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
18720 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
18730 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
18740 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
18750 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
18760 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  e. */.  if( pPag
18770 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
18780 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
18790 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
187a0 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
187b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
187c0 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  es in the file. 
187d0 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50  Store this in nP
187e0 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  age. */.  if( pP
187f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
18800 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  d ){.    nPage =
18810 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
18820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
18830 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
18840 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72        /* Error r
18850 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
18860 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69  eSize() */.    i
18870 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
18880 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73         /* File s
18890 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74  ize in bytes ret
188a0 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53  urned by OsFileS
188b0 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73  ize() */..    as
188c0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
188d0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
188e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
188f0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
18900 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20 28 30  Pager->fd) && (0
18910 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
18920 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
18930 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29 7b  er->fd, &n))) ){
18940 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
18950 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
18960 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
18980 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
18990 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
189a0 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20    nPage = 1;.   
189b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
189c0 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f  age = (Pgno)(n /
189d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
189e0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
189f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18a00 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
18a10 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18a20 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
18a30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
18a40 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
18a50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18a60 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a  bSizeValid = 1;.
18a70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18a80 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
18a90 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
18aa0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
18ab0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a  eater than the .
18ac0 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20    ** configured 
18ad0 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75  maximum pager nu
18ae0 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74  mber, increase t
18af0 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74  he allowed limit
18b00 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
18b10 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65  e file can be re
18b20 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ad..  */.  if( n
18b30 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50  Page>pPager->mxP
18b40 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
18b50 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e  r->mxPgno = (Pgn
18b60 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20  o)nPage;.  }..  
18b70 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
18b80 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72  t variable and r
18b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18ba0 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20  */.  if( pnPage 
18bb0 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d  ){.    *pnPage =
18bc0 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65   nPage;.  }.  re
18bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18be0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
18bf0 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
18c00 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
18c10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18c20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
18c30 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
18c40 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
18c50 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
18c60 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
18c70 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
18c80 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
18c90 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
18ca0 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
18cb0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
18cc0 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
18cd0 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
18ce0 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
18cf0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
18d00 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
18d10 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
18d20 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
18d30 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
18d40 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
18d50 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
18d60 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
18d70 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
18d80 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
18d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18da0 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
18db0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
18dc0 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
18dd0 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
18de0 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
18df0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
18e00 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
18e10 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
18e20 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
18e30 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
18e40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
18e50 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
18e60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
18e70 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
18e80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
18eb0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
18ec0 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
18ed0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
18ee0 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
18ef0 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
18f00 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
18f10 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
18f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
18f30 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
18f40 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
18f50 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
18f60 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
18f70 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
18f80 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
18f90 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
18fa0 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
18fb0 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
18fc0 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
18fd0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
18fe0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
18ff0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
19000 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
19010 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
19020 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
19030 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
19040 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
19050 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
19060 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
19070 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
19080 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
19090 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
190a0 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
190b0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
190c0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
190d0 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
190e0 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
190f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
19100 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
19110 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
19120 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
19130 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
19140 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
19150 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
19160 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
19170 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
19180 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
19190 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
191a0 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
191b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
191c0 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
191d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
191e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
191f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19200 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
19210 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
19220 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
19230 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
19240 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
19250 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
19260 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
19270 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19290 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
192a0 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
192b0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
192c0 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
192d0 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
192e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
192f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19300 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
19310 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
19320 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
19330 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
19340 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
19350 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
19360 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
19370 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
19380 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
19390 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
193a0 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
193b0 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
193c0 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
193d0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
193e0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
193f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
19400 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76   committed..*/.v
19410 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
19420 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
19430 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19440 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
19450 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
19460 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73  zeValid );.  ass
19470 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
19480 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
19490 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
194a0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
194b0 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67 65  ERVED );.  pPage
194c0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
194d0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  e;.}../*.** Shut
194e0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
194f0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
19500 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
19510 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
19520 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
19530 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
19540 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
19550 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
19560 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
19570 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
19580 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
19590 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
195a0 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
195b0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
195c0 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
195d0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
195e0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
195f0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
19600 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
19610 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
19620 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
19630 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
19640 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
19650 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
19660 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
19670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19680 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
19690 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
196a0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
196b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
196c0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
196d0 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
196e0 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
196f0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
19700 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
19710 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
19720 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
19730 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
19740 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
19750 70 50 61 67 65 72 29 7b 0a 20 20 64 69 73 61 62  pPager){.  disab
19760 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
19770 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
19780 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
19790 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72  lloc();.  pPager
197a0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
197b0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
197c0 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
197d0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
197e0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
197f0 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
19800 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
19810 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  lse{.    /* Set 
19820 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72  Pager.journalHdr
19830 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62   to -1 for the b
19840 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61  enefit of the pa
19850 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a  ger_playback() .
19860 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63      ** call whic
19870 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72  h may be made fr
19880 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55  om within pagerU
19890 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
198a0 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a  (). If it.    **
198b0 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e   is not -1, then
198c0 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f   the unsynced po
198d0 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e  rtion of an open
198e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
198f0 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79  y.    ** be play
19900 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
19910 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
19920 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
19930 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a  curs while.    *
19940 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
19950 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
19960 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72  e may become cor
19970 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rupt..    */.   
19980 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19990 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 70 61  Hdr = -1;.    pa
199a0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
199b0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
199c0 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
199d0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
199e0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
199f0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
19a00 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
19a10 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
19a20 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
19a30 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
19a40 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
19a50 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19a60 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
19a70 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
19a80 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
19a90 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
19aa0 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
19ab0 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 61 73 73  pPCache);..  ass
19ac0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
19ad0 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
19ae0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
19af0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
19b00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
19b10 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
19b20 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20  ger->sjfd) );.. 
19b30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
19b40 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
19b50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
19b60 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
19b70 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
19b80 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
19b90 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
19ba0 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65   number for page
19bb0 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71   pPg..*/.Pgno sq
19bc0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
19bd0 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67  mber(DbPage *pPg
19be0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
19bf0 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
19c00 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
19c10 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
19c20 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  ount for page pP
19c30 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
19c40 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
19c50 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
19c60 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
19c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
19c80 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  the journal. In 
19c90 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
19ca0 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
19cb0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
19cc0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
19cd0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
19ce0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
19cf0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
19d00 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  of the.** disk a
19d10 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  nd can be restor
19d20 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
19d30 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
19d40 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
19d50 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
19d60 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e  edSync flag is n
19d70 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  ot set, then thi
19d80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a  s function is a.
19d90 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77  ** no-op. Otherw
19da0 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
19db0 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
19dc0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
19dd0 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  mode.** and the 
19de0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
19df0 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68  istics of the th
19e00 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
19e10 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
19e20 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
19e30 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
19e40 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
19e50 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
19e60 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
19e70 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
19e80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
19e90 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
19ea0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
19eb0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
19ec0 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
19ed0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
19ee0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
19ef0 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
19f00 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
19f10 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
19f20 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
19f30 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
19f40 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
19f50 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
19f60 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
19f70 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
19f80 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
19f90 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
19fa0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
19fb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19fc0 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
19fd0 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
19fe0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
19ff0 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
1a000 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
1a010 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
1a020 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
1a030 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
1a040 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1a050 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
1a060 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
1a070 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
1a080 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
1a090 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
1a0a0 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
1a0b0 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
1a0c0 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
1a0d0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
1a0e0 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
1a0f0 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
1a100 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
1a110 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
1a120 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
1a130 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1a140 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67   }.**.** The Pag
1a150 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1a160 20 69 73 20 6e 65 76 65 72 20 62 65 20 73 65 74   is never be set
1a170 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1a180 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20  iles, or any.** 
1a190 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69  file operating i
1a1a0 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28  n no-sync mode (
1a1b0 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74  Pager.noSync set
1a1c0 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a   to non-zero)..*
1a1d0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1a1e0 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
1a1f0 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
1a200 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
1a210 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
1a220 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
1a230 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
1a240 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
1a250 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1a260 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
1a270 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
1a280 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1a290 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1a2a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
1a2b0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
1a2c0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
1a2d0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
1a2e0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
1a2f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
1a300 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1a310 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1a320 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
1a330 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1a340 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
1a350 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1a380 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ode */.      con
1a390 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c  st int iDc = sql
1a3a0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1a3b0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1a3c0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
1a3d0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1a3e0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
1a3f0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1a400 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1a410 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
1a420 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c        /* Variabl
1a430 65 20 69 4e 52 65 63 4f 66 66 73 65 74 20 69 73  e iNRecOffset is
1a440 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1a450 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
1a460 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  l file.        *
1a470 2a 20 6f 66 20 74 68 65 20 6e 52 65 63 20 66 69  * of the nRec fi
1a480 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
1a490 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
1a4a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
1a4b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
1a4c0 20 66 69 65 6c 64 20 77 69 6c 6c 20 62 65 20 75   field will be u
1a4d0 70 64 61 74 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  pdated following
1a4e0 20 74 68 65 20 78 53 79 6e 63 28 29 20 6f 70 65   the xSync() ope
1a4f0 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ration.        *
1a500 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
1a510 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
1a520 20 20 69 36 34 20 69 4e 52 65 63 4f 66 66 73 65    i64 iNRecOffse
1a530 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
1a540 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
1a550 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
1a560 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1a570 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
1a580 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
1a590 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
1a5a0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
1a5b0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
1a5c0 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
1a5d0 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
1a5e0 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
1a5f0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1a600 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
1a610 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
1a620 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
1a630 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
1a640 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
1a650 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
1a660 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
1a670 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
1a680 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1a690 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
1a6a0 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
1a6b0 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
1a6c0 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
1a6d0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
1a6e0 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
1a6f0 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ons transaction)
1a700 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72  , and a crash or
1a710 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a   power-failure .
1a720 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72          ** occur
1a730 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20  s after nRec is 
1a740 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f  updated but befo
1a750 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  re this connecti
1a760 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20  on writes .     
1a770 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65     ** anything e
1a780 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  lse to the journ
1a790 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d  al file (or comm
1a7a0 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69  its/rolls back i
1a7b0 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts .        ** t
1a7c0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65  ransaction), the
1a7d0 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63  n SQLite may bec
1a7e0 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65  ome confused whe
1a7f0 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20  n doing the .   
1a800 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
1a810 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  nal rollback fol
1a820 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e  lowing recovery.
1a830 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63   It may roll bac
1a840 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  k all.        **
1a850 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
1a860 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20  ions data, then 
1a870 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69  proceed to rolli
1a880 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c  ng back the old,
1a890 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d  .        ** out-
1a8a0 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61  of-date data tha
1a8b0 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61  t follows it. Da
1a8c0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1a8d0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
1a8e0 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b        ** To work
1a8f0 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
1a900 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a910 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f  e does appear to
1a920 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20   contain.       
1a930 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64   ** a valid head
1a940 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67  er following Pag
1a950 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74  er.journalOff, t
1a960 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30  hen write a 0x00
1a970 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
1a980 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
1a990 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69   it to prevent i
1a9a0 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63  t from being rec
1a9b0 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20  ognized..       
1a9c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56   **.        ** V
1a9d0 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72  ariable iNextHdr
1a9e0 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
1a9f0 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77   the offset at w
1aa00 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20  hich this.      
1aa10 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63    ** problematic
1aa20 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63   header will occ
1aa30 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ur, if it exists
1aa40 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64  . aMagic is used
1aa50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20   .        ** as 
1aa60 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
1aa70 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68  er to inspect th
1aa80 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
1aa90 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20  f bytes of.     
1aaa0 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74     ** the potent
1aab0 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ial journal head
1aac0 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
1aad0 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74         i64 iNext
1aae0 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
1aaf0 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
1ab00 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 75 38  ger);.        u8
1ab10 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
1ab20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ab30 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
1ab40 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
1ab50 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1ab60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1ab70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
1ab80 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
1ab90 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
1aba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
1abb0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
1abc0 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
1abd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1abe0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1abf0 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
1ac00 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
1ac10 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
1ac20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ac30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1ac40 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1ac50 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1ac60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ac70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1ac80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1ac90 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
1aca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1acb0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
1acc0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
1acd0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
1ace0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
1acf0 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
1ad00 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
1ad10 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
1ad20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
1ad30 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
1ad40 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
1ad50 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
1ad60 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
1ad70 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
1ad80 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1ad90 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1ada0 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
1adb0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
1adc0 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
1add0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
1ade0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
1adf0 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
1ae00 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
1ae10 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
1ae20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
1ae30 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
1ae40 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
1ae50 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
1ae60 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
1ae70 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1ae80 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
1ae90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1aea0 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
1aeb0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
1aec0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
1aed0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
1aee0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1aef0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1af00 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
1af10 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1af20 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
1af30 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
1af40 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
1af50 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1af60 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
1af70 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
1af80 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
1af90 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
1afa0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1afb0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1afc0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
1afd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1afe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1aff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b000 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
1b010 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
1b020 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
1b030 2c 20 69 4e 52 65 63 4f 66 66 73 65 74 2c 20 34  , iNRecOffset, 4
1b040 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1b050 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
1b060 67 65 72 2d 3e 6a 66 64 2c 20 69 4e 52 65 63 4f  ger->jfd, iNRecO
1b070 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e  ffset, pPager->n
1b080 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
1b090 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b0a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b0b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
1b0c0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
1b0d0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
1b0e0 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
1b0f0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1b100 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1b110 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1b120 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
1b130 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
1b140 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
1b150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b160 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1b170 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1b180 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
1b190 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66   (pPager->sync_f
1b1a0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
1b1b0 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
1b1c0 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
1b1d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1b1e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b1f0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1b210 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
1b220 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
1b230 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
1b240 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72 2e  nced. Set Pager.
1b250 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
1b260 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65   to zero and cle
1b270 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
1b280 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61  D_SYNC flag on a
1b290 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20 2a  ll pagess..    *
1b2a0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  /.    pPager->ne
1b2b0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1b2c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1b2d0 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
1b2e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
1b2f0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
1b300 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1b310 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1b320 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b330 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1b340 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
1b350 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
1b360 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
1b370 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
1b380 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
1b390 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
1b3a0 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
1b3b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
1b3c0 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
1b3d0 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
1b3e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1b3f0 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
1b400 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
1b410 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
1b420 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
1b430 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
1b440 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
1b450 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
1b460 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
1b470 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
1b480 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
1b490 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
1b4a0 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
1b4b0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
1b4c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b4d0 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
1b4e0 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
1b4f0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1b500 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
1b510 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
1b520 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
1b530 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1b540 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
1b550 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
1b560 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
1b570 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1b580 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
1b590 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
1b5a0 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
1b5b0 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
1b5c0 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
1b5d0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
1b5e0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
1b5f0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
1b600 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
1b610 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
1b620 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
1b630 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
1b640 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
1b650 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
1b660 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1b670 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b680 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
1b690 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
1b6a0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
1b6b0 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
1b6c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1b6d0 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
1b6e0 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
1b6f0 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
1b700 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
1b710 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
1b720 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1b730 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
1b740 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
1b750 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
1b760 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
1b770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1b780 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
1b790 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
1b7a0 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
1b7b0 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
1b7c0 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
1b7d0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
1b7e0 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
1b7f0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1b800 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
1b810 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
1b820 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
1b830 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1b840 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1b850 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1b860 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1b870 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1b880 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
1b890 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
1b8a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1b8b0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
1b8c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
1b8d0 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
1b8e0 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
1b8f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1b900 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b910 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
1b920 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
1b930 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1b960 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
1b970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b990 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1b9a0 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
1b9b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b9c0 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
1b9d0 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
1b9e0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
1b9f0 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
1ba00 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
1ba10 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
1ba20 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
1ba30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1ba40 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
1ba50 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
1ba60 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
1ba70 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73  ing.  ** call is
1ba80 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
1ba90 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
1baa0 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
1bab0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
1bac0 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
1bad0 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
1bae0 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
1baf0 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
1bb00 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
1bb10 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
1bb20 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
1bb30 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
1bb40 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
1bb50 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
1bb60 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
1bb70 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
1bb80 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
1bb90 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
1bba0 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
1bbb0 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
1bbc0 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
1bbd0 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
1bbe0 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
1bbf0 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
1bc00 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
1bc10 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
1bc20 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
1bc30 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
1bc40 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
1bc50 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
1bc60 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
1bc70 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
1bc80 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
1bc90 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
1bca0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1bcb0 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
1bcc0 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
1bcd0 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
1bce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1bcf0 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
1bd00 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
1bd10 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
1bd20 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
1bd30 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
1bd40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1bd50 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1bd60 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63 20 3d  SERVED );.  rc =
1bd70 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1bd80 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
1bd90 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20  USIVE_LOCK);..  
1bda0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
1bdb0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
1bdc0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
1bdd0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
1bde0 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
1bdf0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
1be00 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
1be10 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
1be20 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
1be30 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
1be40 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
1be50 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
1be60 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
1be70 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
1be80 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
1be90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1bea0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
1beb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bec0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1bed0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
1bee0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
1bef0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
1bf00 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
1bf10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1bf20 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
1bf30 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
1bf40 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
1bf50 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
1bf60 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
1bf70 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
1bf80 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
1bf90 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
1bfa0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
1bfb0 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
1bfc0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1bfd0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
1bfe0 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
1bff0 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
1c000 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
1c010 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
1c020 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
1c030 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
1c040 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
1c050 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
1c060 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
1c070 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
1c080 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
1c090 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
1c0a0 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
1c0b0 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
1c0c0 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
1c0d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
1c0e0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
1c0f0 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
1c100 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
1c110 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
1c120 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
1c130 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1c140 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
1c150 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1c160 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  to write */.    
1c170 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20    char *pData = 
1c180 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1c190 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e  List->pData, pgn
1c1a0 6f 2c 20 36 29 3b 20 2f 2a 20 44 61 74 61 20 74  o, 6); /* Data t
1c1b0 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20  o write */..    
1c1c0 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
1c1d0 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
1c1e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c1f0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1c200 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
1c210 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1c220 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
1c230 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
1c240 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
1c250 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
1c260 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
1c270 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
1c280 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
1c290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c2a0 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
1c2b0 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
1c2c0 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
1c2d0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1c2e0 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
1c2f0 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
1c300 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
1c310 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
1c320 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1c330 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
1c340 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
1c350 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1c360 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1c370 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
1c380 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
1c390 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c3a0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
1c3b0 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
1c3c0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
1c3d0 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
1c3e0 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
1c3f0 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
1c400 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
1c410 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
1c420 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1c430 2c 20 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 44  , pgno, (u8 *)pD
1c440 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
1c450 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
1c460 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1c470 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1c490 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1c4a0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1c4b0 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
1c4c0 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
1c4d0 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
1c4e0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
1c4f0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
1c500 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
1c510 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
1c520 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1c530 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
1c540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
1c550 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
1c560 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
1c570 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1c580 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
1c590 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1c5a0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1c5b0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
1c5c0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1c5d0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
1c5e0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
1c5f0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
1c600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c610 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
1c620 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
1c630 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
1c640 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
1c650 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49  b-journal. .** I
1c660 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
1c670 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1c680 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69  to use subjRequi
1c690 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65  resPage() to che
1c6a0 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ck .** that it i
1c6b0 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  s really require
1c6c0 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
1c6d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1c6e0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1c6f0 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
1c700 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1c710 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
1c720 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
1c730 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
1c740 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
1c750 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
1c760 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1c770 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
1c780 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
1c790 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
1c7a0 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
1c7b0 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
1c7c0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
1c7d0 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
1c7e0 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
1c7f0 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
1c800 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
1c810 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
1c820 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
1c830 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
1c840 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
1c850 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1c860 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c870 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1c880 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1c890 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  er;.  if( isOpen
1c8a0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
1c8b0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  {.    void *pDat
1c8c0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
1c8d0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
1c8e0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
1c8f0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1c900 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61 72 20  Size);.    char 
1c910 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
1c920 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1c930 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
1c940 20 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45   .    PAGERTRACE
1c950 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
1c960 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1c970 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c980 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a  pPg->pgno));.  .
1c990 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
1c9a0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c  InJournal(pPg) |
1c9b0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
1c9c0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
1c9d0 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
1c9e0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
1c9f0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
1ca00 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
1ca10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ca20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1ca30 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1ca40 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32  er->sjfd, pData2
1ca50 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1ca60 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
1ca70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1ca80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ca90 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
1caa0 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
1cab0 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
1cac0 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
1cad0 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
1cae0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
1caf0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1cb00 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1cb10 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1cb20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cb30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1cb40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1cb50 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
1cb60 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
1cb70 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
1cb80 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
1cb90 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
1cba0 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
1cbb0 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
1cbc0 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
1cbd0 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
1cbe0 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
1cbf0 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
1cc00 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
1cc10 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
1cc20 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1cc30 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
1cc40 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
1cc50 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
1cc60 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
1cc70 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1cc80 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
1cc90 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
1cca0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1ccb0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
1ccc0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1ccd0 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
1cce0 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
1ccf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1cd00 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
1cd10 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
1cd20 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
1cd30 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
1cd40 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
1cd50 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
1cd60 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
1cd70 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
1cd80 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
1cd90 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
1cda0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1cdb0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1cdc0 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
1cdd0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1cde0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
1cdf0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
1ce00 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
1ce10 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
1ce20 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
1ce30 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1ce40 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
1ce50 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
1ce60 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
1ce70 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
1ce80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1ce90 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
1cea0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
1ceb0 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
1cec0 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
1ced0 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
1cee0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
1cef0 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
1cf00 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
1cf10 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1cf20 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
1cf30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1cf40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
1cf50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
1cf60 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
1cf70 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
1cf80 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
1cf90 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 69 73 20  NotSync flag is 
1cfa0 73 65 74 20 62 79 20 74 68 65 20 73 71 6c 69 74  set by the sqlit
1cfb0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 66  e3PagerWrite() f
1cfc0 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 69 74  unction while it
1cfd0 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c  .  ** is journal
1cfe0 6c 69 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77  ling a set of tw
1cff0 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61  o or more databa
1d000 73 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72  se pages that ar
1d010 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a 20 6f 6e  e stored.  ** on
1d020 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73   the same disk s
1d030 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74  ector. Syncing t
1d040 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1d050 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a  t allowed while.
1d060 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
1d070 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69 73 20  pening as it is 
1d080 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
1d090 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 73 75  ll members of su
1d0a0 63 68 20 61 0a 20 20 2a 2a 20 73 65 74 20 6f 66  ch a.  ** set of
1d0b0 20 70 61 67 65 73 20 61 72 65 20 73 79 6e 63 65   pages are synce
1d0c0 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65 74 68  d to disk togeth
1d0d0 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65 20 70  er. So, if the p
1d0e0 61 67 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  age this functio
1d0f0 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79 69 6e 67  n.  ** is trying
1d100 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77   to make clean w
1d110 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
1d120 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64 20 74  urnal sync and t
1d130 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 2a  he doNotSync.  *
1d140 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 72  * flag is set, r
1d150 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1d160 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 54 68  ing anything. Th
1d170 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
1d180 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74 20 68 61  ill.  ** just ha
1d190 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ve to go ahead a
1d1a0 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
1d1b0 77 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e  w page buffer in
1d1c0 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65  stead of.  ** re
1d1d0 75 73 69 6e 67 20 70 50 67 2e 0a 20 20 2a 2a 0a  using pPg..  **.
1d1e0 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
1d1f0 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  if the pager has
1d200 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
1d210 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1d220 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 74 72  , do not.  ** tr
1d230 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
1d240 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67 20 74  ontents of pPg t
1d250 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  o disk..  */.  i
1d260 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1d270 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64  de || (pPager->d
1d280 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d  oNotSync && pPg-
1d290 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1d2a0 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20 20 20 72  D_SYNC) ){.    r
1d2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d2c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  .  }..  /* Sync 
1d2d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d2e0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
1d2f0 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
1d300 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
1d310 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79  C ){.    rc = sy
1d320 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1d330 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d340 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1d350 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
1d360 0a 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d  .      !(pPager-
1d370 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
1d380 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1d390 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20  MEMORY) &&.     
1d3a0 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69   !(sqlite3OsDevi
1d3b0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1d3c0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
1d3d0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1d3e0 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20  APPEND).    ){. 
1d3f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1d400 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  c = 0;.      rc 
1d410 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1d420 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
1d430 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1d440 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1d450 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
1d460 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
1d470 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
1d480 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1d490 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65  image, it may ne
1d4a0 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ed to be written
1d4b0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1d4c0 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  nal..  ** This i
1d4d0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
1d4e0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
1d4f0 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
1d500 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  ow will not.  **
1d510 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
1d520 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
1d530 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
1d540 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65   **.  ** Conside
1d550 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1d560 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
1d570 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ts:.  **.  **   
1d580 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20  BEGIN;.  **     
1d590 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
1d5a0 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66  .  **     <modif
1d5b0 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20  y page X>.  **  
1d5c0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
1d5d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72  .  **       <shr
1d5e0 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
1d5f0 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
1d600 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74  **       pagerSt
1d610 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 2a  ress(page X).  *
1d620 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
1d630 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  O sp;.  **.  ** 
1d640 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77  If (X>Y), then w
1d650 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20  hen pagerStress 
1d660 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58  is called page X
1d670 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
1d680 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  tten.  ** out to
1d690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d6a0 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
1d6b0 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
1d6c0 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
1d6d0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
1d6e0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
1d6f0 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61  " statement, rea
1d700 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c  ding page X will
1d710 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74 61 20   read.  ** data 
1d720 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d730 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
1d740 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
1d750 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
1d760 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
1d770 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
1d780 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
1d790 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
1d7a0 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61 73 20  NT sp".  ** was 
1d7b0 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20  executed..  **. 
1d7c0 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
1d7d0 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65   is to write the
1d7e0 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f   current data fo
1d7f0 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68  r page X into th
1d800 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  e .  ** sub-jour
1d810 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66  nal file now (if
1d820 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1d830 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68  dy there), so th
1d840 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  at it will.  ** 
1d850 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
1d860 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
1d870 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
1d880 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
1d890 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20   ** executed..  
1d8a0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1d8b0 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70  ITE_OK && pPg->p
1d8c0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  gno>pPager->dbSi
1d8d0 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  ze && subjRequir
1d8e0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
1d8f0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
1d900 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  alPage(pPg);.  }
1d910 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
1d920 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1d930 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65   page out to the
1d940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1d950 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1d960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
1d970 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
1d980 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1d990 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
1d9a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  );.  }..  /* Mar
1d9b0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
1d9c0 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
1d9d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d9e0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1d9f0 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
1da00 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1da10 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1da20 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
1da30 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
1da40 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
1da50 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
1da60 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a  Pager, rc);.}...
1da70 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1da80 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  nd initialize a 
1da90 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74  new Pager object
1daa0 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
1dab0 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a  er to it.** in *
1dac0 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67  ppPager. The pag
1dad0 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75  er should eventu
1dae0 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79  ally be freed by
1daf0 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74   passing it.** t
1db00 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  o sqlite3PagerCl
1db10 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ose()..**.** The
1db20 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
1db30 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20  ent is the path 
1db40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1db50 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a  file to open..**
1db60 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
1db70 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
1db80 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
1db90 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
1dba0 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
1dbb0 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
1dbc0 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70   be cached. Temp
1dbd0 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20  orary files are 
1dbe0 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
1dbf0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
1dc00 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64   they are closed
1dc10 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  . If zFilename i
1dc20 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
1dc30 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d  n .** all inform
1dc40 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
1dc50 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65   cache. It is ne
1dc60 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
1dc70 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61  isk. .** This ca
1dc80 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
1dc90 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d  lement an in-mem
1dca0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
1dcb0 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70  .** The nExtra p
1dcc0 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
1dcd0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1dce0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
1dcf0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
1dd00 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67  ng with each pag
1dd10 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69  e reference. Thi
1dd20 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  s space is avail
1dd30 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
1dd40 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69  .** via the sqli
1dd50 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
1dd60 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68  () API..**.** Th
1dd70 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
1dd80 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63   is used to spec
1dd90 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74  ify properties t
1dda0 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a  hat affect the.*
1ddb0 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  * operation of t
1ddc0 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f  he pager. It sho
1ddd0 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f  uld be passed so
1dde0 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69  me bitwise combi
1ddf0 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  nation.** of the
1de00 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
1de10 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f  NAL and PAGER_NO
1de20 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e  _READLOCK flags.
1de30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
1de40 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
1de50 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
1de60 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
1de70 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
1de80 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
1de90 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
1dea0 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
1deb0 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
1dec0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
1ded0 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
1dee0 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
1def0 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
1df00 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
1df10 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
1df20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
1df30 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
1df40 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
1df50 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
1df60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1df70 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
1df80 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
1df90 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
1dfa0 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
1dfb0 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
1dfc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
1dfd0 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
1dfe0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
1dff0 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
1e000 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
1e010 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
1e020 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
1e030 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1e040 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
1e050 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1e060 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
1e070 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
1e080 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
1e090 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
1e0a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
1e0b0 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
1e0c0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
1e0d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1e0e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
1e0f0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1e100 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
1e110 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
1e120 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
1e130 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
1e140 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
1e150 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
1e160 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
1e170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
1e180 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
1e190 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
1e1a0 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
1e1b0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
1e1c0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
1e1d0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
1e1e0 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75  Open() */.){.  u
1e1f0 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
1e200 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
1e210 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1e220 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
1e230 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
1e240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e250 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
1e260 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1e270 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
1e280 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1e290 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
1e2a0 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
1e2b0 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
1e2c0 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
1e2d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1e2e0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1e2f0 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
1e300 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
1e310 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e320 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
1e330 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
1e340 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
1e350 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
1e360 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
1e370 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
1e380 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
1e390 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
1e3a0 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
1e3b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1e3c0 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
1e3d0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
1e3e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1e3f0 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
1e400 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
1e410 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
1e420 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
1e430 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
1e440 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
1e450 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
1e460 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
1e470 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
1e480 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
1e490 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  t read-lock */. 
1e4a0 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
1e4b0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
1e4c0 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
1e4d0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
1e4e0 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
1e4f0 20 20 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74    u16 szPageDflt
1e500 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
1e510 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
1e520 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
1e530 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ze */..  /* Figu
1e540 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
1e550 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
1e560 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
1e570 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
1e580 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
1e590 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
1e5a0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
1e5b0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1e5c0 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20  ). This.  ** is 
1e5d0 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63  the maximum spac
1e5e0 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
1e5f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
1e600 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1e610 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75  .  ** and a regu
1e620 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
1e630 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68  -handle. Note th
1e640 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f  at a "regular jo
1e650 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20  urnal-handle".  
1e660 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70  ** may be a wrap
1e670 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63  per capable of c
1e680 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74  aching the first
1e690 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1e6a0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
1e6b0 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69  e in memory to i
1e6c0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f  mplement the ato
1e6d0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
1e6e0 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a  zation (see .  *
1e6f0 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f  * source file jo
1e700 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20  urnal.c)..  */. 
1e710 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
1e720 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71  nalSize(pVfs)>sq
1e730 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
1e740 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75  ize() ){.    jou
1e750 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73  rnalFileSize = s
1e760 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
1e770 65 28 70 56 66 73 29 3b 0a 20 20 7d 65 6c 73 65  e(pVfs);.  }else
1e780 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
1e790 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4d  eSize = sqlite3M
1e7a0 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 3b  emJournalSize();
1e7b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
1e7c0 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
1e7d0 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
1e7e0 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
1e7f0 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
1e800 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  r = 0;..  /* Com
1e810 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
1e820 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1e830 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
1e840 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
1e850 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
1e860 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
1e870 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
1e880 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
1e890 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
1e8a0 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
1e8b0 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
1e8c0 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
1e8d0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
1e8e0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
1e8f0 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  ){.    nPathname
1e900 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
1e910 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
1e920 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
1e930 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32  lloc(nPathname*2
1e940 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
1e950 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
1e960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1e970 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  OMEM;.    }.#ifn
1e980 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e990 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
1e9a0 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
1e9b0 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
1e9c0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
1e9d0 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68  = 1;.      zPath
1e9e0 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  name[0] = 0;.   
1e9f0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1ea00 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e    {.      zPathn
1ea10 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d  ame[0] = 0; /* M
1ea20 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c  ake sure initial
1ea30 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c  ized even if Ful
1ea40 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c  lPathname() fail
1ea50 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  s */.      rc = 
1ea60 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
1ea70 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
1ea80 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
1ea90 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
1eaa0 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61    }..    nPathna
1eab0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
1eac0 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
1ead0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1eae0 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e  ITE_OK && nPathn
1eaf0 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61  ame+8>pVfs->mxPa
1eb00 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
1eb10 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
1eb20 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  s taken when the
1eb30 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65   journal path re
1eb40 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
1eb50 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1eb60 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c  being opened wil
1eb70 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70  l be more than p
1eb80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
1eb90 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69        ** bytes i
1eba0 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d  n length. This m
1ebb0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1ebc0 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  e cannot be open
1ebd0 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ed,.      ** as 
1ebe0 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
1ebf0 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
1ec00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ec10 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a   or even.      *
1ec20 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f  * check for a ho
1ec30 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t-journal before
1ec40 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   reading..      
1ec50 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
1ec60 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
1ec70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1ec80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ec90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1eca0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
1ecb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ecc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
1ecd0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
1ece0 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
1ecf0 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
1ed00 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
1ed10 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
1ed20 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
1ed30 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
1ed40 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
1ed50 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
1ed60 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
1ed70 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
1ed80 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
1ed90 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
1edc0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1edd0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
1ee00 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
1ee10 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
1ee20 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
1ee30 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
1ee40 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
1ee50 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
1ee60 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
1ee70 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
1ee80 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
1ee90 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
1eea0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
1eeb0 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
1eec0 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
1eed0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
1eee0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
1eef0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
1ef00 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
1ef10 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
1ef20 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
1ef30 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
1ef40 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
1ef50 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
1ef60 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1ef70 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61  .    sizeof(*pPa
1ef80 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ger) +          
1ef90 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
1efa0 75 72 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68  ure */.    pcach
1efb0 65 53 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20  eSize      +    
1efc0 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
1efd0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 70   object */.    p
1efe0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 20 2b  Vfs->szOsFile  +
1eff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f000 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
1f010 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
1f020 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
1f030 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
1f040 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
1f050 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
1f060 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   +             /
1f070 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
1f080 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
1f090 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 2f   + 1           /
1f0a0 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  * zJournal */.  
1f0b0 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29  );.  if( !pPtr )
1f0c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1f0d0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
1f0e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f0f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50  _NOMEM;.  }.  pP
1f100 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
1f110 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
1f120 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
1f130 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
1f140 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 73 69 7a  he*)(pPtr += siz
1f150 65 6f 66 28 2a 70 50 61 67 65 72 29 29 3b 0a 20  eof(*pPager));. 
1f160 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
1f170 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
1f180 70 50 74 72 20 2b 3d 20 70 63 61 63 68 65 53 69  pPtr += pcacheSi
1f190 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ze);.  pPager->s
1f1a0 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
1f1b0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 70 56  ile*)(pPtr += pV
1f1c0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
1f1d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
1f1e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
1f1f0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
1f200 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
1f210 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
1f220 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
1f230 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
1f240 7a 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ze);..  /* Fill 
1f250 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
1f260 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
1f270 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
1f280 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
1f290 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
1f2a0 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  me ){.    pPager
1f2b0 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
1f2c0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
1f2d0 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20  Pathname + 1);. 
1f2e0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
1f2f0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
1f300 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
1f310 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e);.    memcpy(p
1f320 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1f330 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1f340 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1f350 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
1f360 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
1f370 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b   "-journal", 8);
1f380 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1f390 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
1f3a0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
1f3b0 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
1f3c0 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
1f3d0 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
1f3e0 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
1f3f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
1f400 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
1f410 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44  name[0] && !memD
1f420 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  b ){.    int fou
1f430 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1f440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
1f450 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
1f460 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
1f470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f480 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
1f490 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
1f4a0 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
1f4b0 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
1f4c0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
1f4d0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
1f4e0 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20  DONLY);..    /* 
1f4f0 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
1f500 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
1f510 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
1f520 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a  te access,.    *
1f530 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
1f540 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
1f550 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
1f560 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a  create the.    *
1f570 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
1f580 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
1f590 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
1f5a0 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a  ximum of:.    **
1f5b0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c  .    **    + SQL
1f5c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
1f5d0 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20  _SIZE,.    **   
1f5e0 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
1f5f0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1f600 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
1f610 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c     **    + The l
1f620 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65  argest page size
1f630 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69   that can be wri
1f640 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tten atomically.
1f650 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1f660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f670 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
1f680 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
1f690 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
1f6a0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44   assert(SQLITE_D
1f6b0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1f6c0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
1f6d0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
1f6e0 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67  .      if( szPag
1f6f0 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
1f700 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
1f710 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1f720 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
1f730 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
1f740 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
1f750 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
1f760 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
1f770 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
1f780 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f790 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1f7a0 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61 67 65  flt = (u16)pPage
1f7b0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
1f7c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f7d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f7e0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1f7f0 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  TE.      {.     
1f800 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
1f810 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1f820 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1f830 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
1f840 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
1f850 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
1f860 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
1f870 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
1f880 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1f890 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
1f8a0 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
1f8b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
1f8c0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
1f8d0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
1f8e0 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  6);.        for(
1f8f0 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
1f900 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
1f910 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
1f920 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
1f930 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51       if( iDc&(SQ
1f940 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f950 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20  C|(ii>>8)) ){.  
1f960 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
1f970 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
1f980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f990 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1f9a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1f9b0 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
1f9c0 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
1f9d0 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
1f9e0 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
1f9f0 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
1fa00 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
1fa10 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
1fa20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
1fa30 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
1fa40 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
1fa50 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
1fa60 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
1fa70 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  rite()..    **. 
1fa80 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
1fa90 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f  h is also run fo
1faa0 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
1fab0 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d  atabase. An in-m
1fac0 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74  emory.    ** dat
1fad0 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d  abase is the sam
1fae0 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e as a temp-file
1faf0 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77   that is never w
1fb00 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20  ritten out to.  
1fb10 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73    ** disk and us
1fb20 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  es an in-memory 
1fb30 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1fb40 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65  ..    */ .    te
1fb50 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
1fb60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1fb70 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
1fb80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1fb90 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
1fba0 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
1fbb0 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
1fbc0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
1fbd0 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
1fbe0 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
1fbf0 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
1fc00 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
1fc10 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
1fc20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fc30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fc40 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
1fc50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fc60 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
1fc70 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
1fc80 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1fc90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fca0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
1fcb0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
1fcc0 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
1fcd0 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
1fce0 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  free the .  ** P
1fcf0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
1fd00 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
1fd10 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
1fd20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1fd30 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1fd40 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b  er->pTmpSpace );
1fd50 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
1fd60 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
1fd70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1fd80 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
1fd90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1fda0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1fdb0 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
1fdc0 2e 20 2a 2f 0a 20 20 6e 45 78 74 72 61 20 3d 20  . */.  nExtra = 
1fdd0 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
1fde0 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
1fdf0 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
1fe00 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
1fe10 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
1fe30 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
1fe40 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
1fe50 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
1fe60 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
1fe70 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
1fe80 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
1fe90 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
1fea0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
1feb0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
1fec0 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
1fed0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
1fee0 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
1fef0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1ff00 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
1ff10 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
1ff20 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64  adlock = (noRead
1ff30 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
1ff40 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61  ) ?1:0;.  /* pPa
1ff50 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
1ff60 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
1ff70 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
1ff80 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
1ff90 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
1ffa0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
1ffb0 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62  alid = (u8)memDb
1ffc0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
1ffd0 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
1ffe0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
1fff0 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
20000 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
20010 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
20020 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
20030 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
20040 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
20050 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
20060 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65  NLOCK; */.  asse
20070 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
20080 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
20090 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
200a0 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
200b0 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
200c0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
200d0 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
200e0 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
200f0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
20100 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
20110 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
20120 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
20130 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
20140 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
20150 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
20160 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
20170 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
20180 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
20190 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
201a0 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
201b0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
201c0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
201d0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
201e0 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
201f0 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
20200 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
20210 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20  )readOnly;.  /* 
20220 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
20230 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
20240 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50 61  r->noSync = (pPa
20250 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
20260 20 21 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f 31   !useJournal) ?1
20270 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
20280 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
20290 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
202a0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
202b0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
202c0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
202d0 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
202e0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
202f0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
20300 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20310 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
20320 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
20330 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70  ra = nExtra;.  p
20340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
20350 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
20360 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
20370 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
20380 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
20390 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
203a0 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
203b0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
203c0 3b 0a 20 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  ;.  if( memDb ){
203d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
203e0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
203f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
20400 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
20410 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
20420 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
20430 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
20440 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
20450 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
20460 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
20470 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
20480 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61  sh)); */.  *ppPa
20490 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
204a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
204b0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
204c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
204d0 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
204e0 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
204f0 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
20500 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
20510 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
20520 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
20530 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
20540 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
20550 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
20560 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
20570 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
20580 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
20590 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
205a0 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
205b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
205c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
205d0 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
205e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
205f0 65 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  e criteria are m
20600 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
20610 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
20620 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
20630 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
20640 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
20650 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
20660 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
20670 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20680 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
20690 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
206a0 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
206b0 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
206c0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
206d0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
206e0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
206f0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
20700 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
20710 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
20720 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
20730 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
20740 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
20750 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
20760 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
20770 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
20780 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
20790 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
207a0 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
207b0 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
207c0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
207d0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
207e0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
207f0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
20800 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f   not open the jo
20810 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 78  urnal file to ex
20820 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e  amine its.** con
20830 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74 68  tent.  Hence, th
20840 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
20850 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65  contain the name
20860 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20   of a master.** 
20870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
20880 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  t has been delet
20890 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f  ed, and hence no
208a0 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a  t be hot.  Or.**
208b0 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
208c0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
208d0 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20   be zeroed out. 
208e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
208f0 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f 76   does not discov
20900 65 72 20 74 68 65 73 65 20 63 61 73 65 73 20 6f  er these cases o
20910 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72  f a non-hot jour
20920 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20  nal - if the.** 
20930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
20940 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 65  sts and is not e
20950 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74 69 6e  mpty this routin
20960 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20  e assumes it.** 
20970 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70 61 67  is hot.  The pag
20980 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
20990 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
209a0 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ver that the.** 
209b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
209c0 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
209d0 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a  nd will no-op..*
209e0 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
209f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
20a00 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
20a10 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
20a20 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
20a30 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
20a40 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
20a50 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
20a60 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
20a70 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
20a80 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
20a90 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
20aa0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
20ab0 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
20ac0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
20ad0 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
20ae0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
20af0 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
20b00 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
20b10 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
20b20 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
20b30 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
20b40 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
20b50 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
20b60 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
20b70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
20b80 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
20b90 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
20ba0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20bc0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
20bd0 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 30 3b   int exists = 0;
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20bf0 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
20c00 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
20c10 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
20c20 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
20c30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20c40 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
20c50 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
20c60 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 61 73 73 65 72  lock */..  asser
20c70 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
20c80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20c90 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
20ca0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
20cb0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
20cc0 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
20cd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20ce0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
20cf0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20d00 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
20d10 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
20d20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20d30 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
20d40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20d50 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
20d60 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
20d70 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
20d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20d90 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
20da0 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a       int nPage;.
20db0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20dc0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
20dd0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
20de0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20e00 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
20e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
20e20 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
20e30 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
20e40 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
20e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20e60 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
20e70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20e80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
20e90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20ea0 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
20eb0 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
20ec0 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
20ed0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
20ee0 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
20ef0 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
20f00 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
20f10 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
20f20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
20f30 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
20f40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
20f50 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
20f60 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
20f70 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
20f80 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
20f90 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
20fa0 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
20fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20fc0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
20fd0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
20fe0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
20ff0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
21000 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
21010 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
21020 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21040 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
21050 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
21060 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
21070 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
21080 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
21090 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
210a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
210b0 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
210c0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
210d0 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
210e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
210f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21100 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
21110 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20  64 iOffset;     
21120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
21130 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66 69  yte offset of fi
21140 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
21150 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
21160 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
21170 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45  ER_SHARED && !ME
21180 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21 69  MDB );..  if( !i
21190 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
211a0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
211b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
211c0 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e );.    memset(
211d0 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
211e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
211f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21200 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
21210 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 4f 66 66  READ;.  }.  iOff
21220 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
21230 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
21240 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
21250 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
21260 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
21270 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
21280 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  ize, iOffset);. 
21290 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
212a0 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
212b0 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
212c0 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
212d0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
212e0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
212f0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
21300 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
21310 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45  rs));.  }.  CODE
21320 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
21330 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 29 3b  pData, pgno, 3);
21340 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
21350 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
21360 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
21370 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
21380 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
21390 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
213a0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
213b0 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
213c0 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
213d0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
213e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
213f0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
21400 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
21410 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
21420 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21430 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21440 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
21450 68 65 6e 65 76 65 72 20 74 68 65 20 75 70 70 65  henever the uppe
21460 72 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 73  r layer requests
21470 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70   a database.** p
21480 61 67 65 20 69 73 20 72 65 71 75 65 73 74 65 64  age is requested
21490 2c 20 62 65 66 6f 72 65 20 74 68 65 20 63 61 63  , before the cac
214a0 68 65 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  he is checked fo
214b0 72 20 61 20 73 75 69 74 61 62 6c 65 20 70 61 67  r a suitable pag
214c0 65 0a 2a 2a 20 6f 72 20 61 6e 79 20 64 61 74 61  e.** or any data
214d0 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
214e0 65 20 64 61 74 61 62 61 73 65 2e 20 49 74 20 70  e database. It p
214f0 65 72 66 6f 72 6d 73 20 74 68 65 20 66 6f 6c 6c  erforms the foll
21500 6f 77 69 6e 67 0a 2a 2a 20 74 77 6f 20 66 75 6e  owing.** two fun
21510 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ctions:.**.**   
21520 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
21530 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
21540 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
21550 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
21560 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
21570 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
21580 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
21590 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
215a0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
215b0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
215c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
215d0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
215e0 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
215f0 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
21600 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
21610 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
21620 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
21630 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
21640 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
21650 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
21660 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
21670 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
21680 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
21690 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
216a0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
216b0 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
216c0 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
216d0 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
216e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
216f0 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
21700 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
21710 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
21720 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
21730 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
21740 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
21750 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
21760 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
21770 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
21780 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
21790 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
217a0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
217b0 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
217c0 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
217d0 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
217e0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
217f0 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
21800 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
21810 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
21820 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
21830 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
21840 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
21850 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
21860 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
21870 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   the operation d
21880 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20  escribed by (2) 
21890 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74  above is not att
218a0 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74  empted, and if t
218b0 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69  he.** pager is i
218c0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
218d0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
218e0 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69  TE_FULL when thi
218f0 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  s is called,.** 
21900 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
21910 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
21920 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65  turned. It is pe
21930 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20  rmitted to read 
21940 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
21950 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46  when in SQLITE_F
21960 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e  ULL error state.
21970 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
21980 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
21990 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
219a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
219b0 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49  rned. If an.** I
219c0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
219d0 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
219e0 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
219f0 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
21a00 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72  urnal.** file or
21a10 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
21a20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
21a30 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
21a40 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
21a50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21a60 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
21a70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
21a80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21ab0 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  /.  int isErrorR
21ac0 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  eset = 0;       
21ad0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21ae0 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f  f recovering fro
21af0 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f  m error state */
21b00 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64  ..  /* If this d
21b10 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
21b20 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  d for exclusive 
21b30 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f  access, has no o
21b40 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
21b50 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
21b60 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72   and is in an er
21b70 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 69 73 20  ror-state, this 
21b80 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63  is a chance to c
21b90 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72  lear.  ** the er
21ba0 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65  ror. Discard the
21bb0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
21bc0 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
21bd0 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20   treat any.  ** 
21be0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
21bf0 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e as a hot-journ
21c00 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  al..  */.  if( !
21c10 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
21c20 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
21c30 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
21c40 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
21c50 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
21c60 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
21c70 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  de .  ){.    if(
21c80 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
21c90 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 73  jfd) ){.      is
21ca0 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a  ErrorReset = 1;.
21cb0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
21cc0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
21cd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
21ce0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
21cf0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
21d00 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20   pager is still 
21d10 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
21d20 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65  e, do not procee
21d30 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20  d. The error .  
21d40 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65  ** state will be
21d50 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65   cleared at some
21d60 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
21d70 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61  ture when all pa
21d80 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  ge .  ** referen
21d90 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20  ces are dropped 
21da0 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61  and the cache ca
21db0 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  n be discarded..
21dc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
21dd0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
21de0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
21df0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
21e00 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
21e10 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
21e20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
21e30 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
21e40 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74   || isErrorReset
21e50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21e60 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
21e70 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
21e80 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f  .    int isHotJo
21e90 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61  urnal = 0;.    a
21ea0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
21eb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
21ec0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
21ed0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
21ee0 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  he)==0 );.    if
21ef0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
21f00 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
21f10 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
21f20 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
21f30 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
21f40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21f60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21f70 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
21f80 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  OCK );.        r
21f90 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
21fa0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
21fb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
21fc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
21fd0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
21fe0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
21ff0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
22000 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
22010 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22020 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
22030 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  LOCK );..    /* 
22040 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
22050 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
22060 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
22070 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
22080 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
22090 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
220a0 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
220b0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
220c0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
220d0 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52     if( !isErrorR
220e0 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63  eset ){.      rc
220f0 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
22100 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a  (pPager, &isHotJ
22110 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
22120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22130 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
22140 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
22150 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
22160 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69  sErrorReset || i
22170 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sHotJournal ){. 
22180 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
22190 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
221a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
221b0 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
221c0 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
221d0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
221e0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
221f0 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
22200 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
22210 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
22220 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
22230 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
22240 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
22250 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
22260 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
22270 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
22280 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
22290 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
222a0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
222b0 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
222c0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
222d0 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
222e0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
222f0 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
22300 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
22310 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
22320 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
22330 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
22340 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
22350 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
22360 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
22370 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
22380 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22390 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
223a0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
223b0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
223c0 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
223d0 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
223e0 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
223f0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
22400 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
22410 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
22420 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53  er->state<EXCLUS
22430 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
22440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22450 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
22460 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
22470 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
22480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22490 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
224a0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
224b0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
224c0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
224d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
224e0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
224f0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
22500 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  E;.      }. .   
22510 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
22520 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
22530 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
22540 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
22550 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75   .      ** exclu
22560 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
22570 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
22580 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
22590 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
225a0 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
225b0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
225c0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
225d0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
225e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  he.      ** OsTr
225f0 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
22600 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
22610 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
22620 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
22630 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
22640 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
22650 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
22660 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
22670 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
22680 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
22690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
226a0 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65  ccess(pVfs,pPage
226b0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49  r->zJournal,SQLI
226c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
226d0 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20  ,&res);.        
226e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
226f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
22700 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
22710 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
22720 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
22730 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
22740 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
22750 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
22760 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
22770 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
22780 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
22790 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
227a0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
227b0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
227c0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
227d0 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
227e0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
227f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
22800 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
22810 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
22820 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22830 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
22840 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
22850 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
22860 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22870 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
22880 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22890 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
228a0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
228b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
228c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
228d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
228e0 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
228f0 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  xist, that means
22900 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
22910 65 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ess.            
22920 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  ** has already r
22930 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f  olled it back */
22940 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22950 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
22960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22970 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22980 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
229a0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
229b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
229c0 4f 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65  ODO: Why are the
229d0 73 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f  se cleared here?
229e0 20 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79   Is it necessary
229f0 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  ? */.      pPage
22a00 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
22a10 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
22a20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22a30 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
22a40 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
22a50 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
22a60 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
22a70 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
22a80 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
22a90 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
22aa0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
22ab0 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
22ac0 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
22ad0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
22ae0 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
22af0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
22b00 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
22b10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
22b20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
22b30 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
22b40 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
22b50 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  nt cache..      
22b60 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
22b70 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
22b80 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ger, 1);.      i
22b90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22bb0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
22bc0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
22bd0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
22be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
22bf0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74  ert( (pPager->st
22c00 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
22c10 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  D).           ||
22c20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
22c30 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
22c40 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53  r->state>PAGER_S
22c50 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a  HARED).      );.
22c60 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
22c70 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
22c80 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
22c90 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
22ca0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
22cb0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
22cc0 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
22cd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22ce0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
22cf0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
22d00 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
22d10 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
22d20 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
22d30 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
22d40 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
22d50 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
22d60 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
22d70 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
22d80 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
22d90 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
22da0 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
22db0 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
22dc0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
22dd0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
22de0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
22df0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
22e00 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
22e10 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
22e20 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
22e30 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
22e40 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
22e50 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
22e60 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
22e70 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
22e80 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
22e90 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
22ea0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
22eb0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
22ec0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
22ed0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
22ee0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
22ef0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
22f00 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
22f10 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
22f20 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
22f30 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
22f40 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
22f50 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
22f60 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
22f70 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
22f80 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
22f90 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
22fa0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
22fb0 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20    */.      char 
22fc0 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
22fd0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
22fe0 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71  Vers)];.      sq
22ff0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
23000 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
23010 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
23020 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
23030 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65        rc = pPage
23040 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
23050 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
23060 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23070 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23080 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
23090 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
230a0 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
230b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
230c0 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
230d0 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
230e0 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
230f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23100 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
23110 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
23120 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
23130 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
23140 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23160 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
23170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23180 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
23190 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
231a0 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
231b0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
231c0 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
231d0 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
231e0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
231f0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
23200 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
23210 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
23220 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
23230 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
23240 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
23250 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
23260 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
23270 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a  R_SHARED );.  }.
23280 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
23290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
232a0 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e  .    /* pager_un
232b0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
232c0 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  p for exclusive 
232d0 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f  mode and in-memo
232e0 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ry databases. */
232f0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
23300 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
23310 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23320 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
23330 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
23340 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
23350 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
23360 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
23370 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
23380 70 61 67 65 72 2e 0a 2a 2f 20 0a 73 74 61 74 69  pager..*/ .stati
23390 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
233a0 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
233b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
233c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
233d0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
233e0 50 43 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20  PCache)==0 ){.  
233f0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
23400 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
23410 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
23420 72 6f 70 20 61 20 70 61 67 65 20 66 72 6f 6d 20  rop a page from 
23430 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20  the cache using 
23440 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
23450 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  p()..**.** If th
23460 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  is means there a
23470 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20  re now no pages 
23480 77 69 74 68 20 72 65 66 65 72 65 6e 63 65 73 20  with references 
23490 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62  to them, a rollb
234a0 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e  ack.** occurs an
234b0 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
234c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
234d0 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  moved..*/.static
234e0 20 76 6f 69 64 20 70 61 67 65 72 44 72 6f 70 50   void pagerDropP
234f0 61 67 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  age(DbPage *pPg)
23500 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
23510 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
23520 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
23530 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 70 61 67  Drop(pPg);.  pag
23540 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
23550 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
23560 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66  ** Acquire a ref
23570 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e  erence to page n
23580 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61  umber pgno in pa
23590 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61  ger pPager (a pa
235a0 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ge.** reference 
235b0 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a  has type DbPage*
235c0 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ). If the reques
235d0 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
235e0 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
235f0 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
23600 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
23610 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
23620 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
23630 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23640 63 61 6c 6c 73 20 70 61 67 65 72 53 68 61 72 65  calls pagerShare
23650 64 4c 6f 63 6b 28 29 20 74 6f 20 6f 62 74 61 69  dLock() to obtai
23660 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  n a SHARED lock 
23670 6f 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  on.** the databa
23680 73 65 20 66 69 6c 65 20 69 66 20 73 75 63 68 20  se file if such 
23690 61 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  a lock or greate
236a0 72 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  r is not already
236b0 20 68 65 6c 64 2e 0a 2a 2a 20 54 68 69 73 20 6d   held..** This m
236c0 61 79 20 63 61 75 73 65 20 68 6f 74 2d 6a 6f 75  ay cause hot-jou
236d0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
236e0 20 61 20 63 61 63 68 65 20 70 75 72 67 65 2e 20   a cache purge. 
236f0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20  See comments.** 
23700 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 70  above function p
23710 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
23720 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a   for details..**
23730 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
23740 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
23750 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
23760 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
23770 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
23780 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
23790 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
237a0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
237b0 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
237c0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
237d0 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
237e0 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
237f0 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
23800 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
23810 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
23820 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
23830 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
23840 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
23850 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
23860 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
23870 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
23880 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
23890 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
238a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
238b0 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
238c0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
238d0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
238e0 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
238f0 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
23900 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
23910 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
23920 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
23930 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
23940 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
23950 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
23960 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
23970 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
23980 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
23990 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
239a0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
239b0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
239c0 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
239d0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
239e0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
239f0 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
23a00 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
23a10 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
23a20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
23a30 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
23a40 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
23a50 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
23a60 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
23a70 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
23a80 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
23a90 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
23aa0 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
23ab0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
23ac0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
23ad0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
23ae0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
23af0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
23b00 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
23b10 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
23b20 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72   seperate scenar
23b30 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
23b40 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
23b50 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
23b60 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
23b70 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
23b80 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
23b90 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
23ba0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
23bb0 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
23bc0 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
23bd0 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
23be0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 77 69 74   to populate wit
23bf0 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
23c00 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
23c10 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
23c20 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
23c30 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
23c40 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
23c50 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
23c60 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
23c70 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
23c80 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
23c90 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
23ca0 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
23cb0 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
23cc0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
23cd0 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
23ce0 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
23cf0 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
23d00 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
23d10 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
23d20 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
23d30 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
23d40 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
23d50 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
23d60 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
23d70 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
23d80 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
23d90 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
23da0 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
23db0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23dc0 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
23dd0 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
23de0 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
23df0 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
23e00 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
23e10 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
23e20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
23e30 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
23e40 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
23e50 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
23e60 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
23e70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
23e80 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
23e90 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
23ea0 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
23eb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
23ec0 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
23ed0 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
23ee0 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
23ef0 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
23f00 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
23f10 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
23f20 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
23f30 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
23f40 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
23f50 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
23f60 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
23f70 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
23f80 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
23f90 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
23fa0 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
23fb0 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
23fc0 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
23fd0 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
23fe0 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
23ff0 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
24000 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
24010 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
24020 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
24030 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
24040 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
24050 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
24060 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
24070 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
24080 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
24090 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
240a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
240b0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
240c0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
240d0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
240e0 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
240f0 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
24100 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24110 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
24120 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
24130 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
24140 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
24150 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
24160 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67   true */.){.  Pg
24170 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
24180 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
24190 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
241a0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
241b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
241c0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
241d0 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c  UNLOCK .       |
241e0 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  | sqlite3PcacheR
241f0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
24200 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20  pPCache)>0 .    
24210 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20     || pgno==1.  
24220 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
24230 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
24240 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
24250 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
24260 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
24270 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
24280 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
24290 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
242a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
242b0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
242c0 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
242d0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
242e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
242f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
24300 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
24310 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
24320 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
24330 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
24340 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
24350 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
24360 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
24370 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
24380 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
24390 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20   accessed, then 
243a0 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63  get a SHARED loc
243b0 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
243c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67  tabase file. pag
243d0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69  erSharedLock() i
243e0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20  s a no-op if .  
243f0 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f  ** a database lo
24400 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
24410 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ld..  */.  rc = 
24420 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
24430 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
24440 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24450 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24460 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
24470 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
24480 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72  R_UNLOCK );..  r
24490 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
244a0 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
244b0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
244c0 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63   &pPg);.  if( rc
244d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
244e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
244f0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  }.  assert( pPg-
24500 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
24510 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
24520 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
24530 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
24540 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61  ;.  if( pPg->pPa
24550 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ger==0 ){.    /*
24560 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
24570 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
24580 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
24590 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
245a0 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
245b0 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ized..    */.   
245c0 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50   int nMax;.    P
245d0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
245e0 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50  ->nMiss);.    pP
245f0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
24600 65 72 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  er;..    rc = sq
24610 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
24620 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61  unt(pPager, &nMa
24630 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  x);.    if( rc!=
24640 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24650 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
24660 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
24670 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24680 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c  }..    if( nMax<
24690 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
246a0 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  DB || noContent 
246b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
246c0 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
246d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
246e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
246f0 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
24700 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
24710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24720 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
24730 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
24740 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
24750 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
24760 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
24770 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
24780 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
24790 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
247a0 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
247b0 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
247c0 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
247d0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
247e0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
247f0 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
24800 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
24810 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
24820 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
24830 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
24840 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
24850 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
24860 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
24870 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
24880 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24890 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
248a0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
248b0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
248c0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
248d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
248e0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
248f0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
24900 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
24910 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
24920 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
24930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
24940 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
24950 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
24960 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
24970 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
24980 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
24990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
249a0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
249b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
249c0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
249d0 63 28 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  c();.      }else
249e0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
249f0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
24a00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24a10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24a20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
24a30 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
24a40 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
24a50 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
24a60 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
24a70 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
24a80 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
24a90 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
24aa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
24ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
24ac0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
24ad0 20 20 20 20 20 20 20 20 70 61 67 65 72 44 72 6f          pagerDro
24ae0 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  pPage(pPg);.    
24af0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24b00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
24b10 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
24b20 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
24b30 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
24b40 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
24b50 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
24b60 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
24b70 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
24b80 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
24b90 2a 2f 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  */.    PAGER_INC
24ba0 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
24bb0 0a 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20  .  }..  *ppPage 
24bc0 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
24bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
24be0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
24bf0 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
24c00 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
24c10 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
24c20 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
24c30 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
24c40 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
24c50 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
24c60 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
24c70 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
24c80 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e  he. Also, return
24c90 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61   0 if the .** pa
24ca0 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
24cb0 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
24cc0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24cd0 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72  is called,.** or
24ce0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
24cf0 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
24d00 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
24d10 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  LITE_FULL..**.**
24d20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
24d30 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
24d40 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
24d50 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
24d60 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
24d70 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
24d80 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
24d90 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
24da0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
24db0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
24dc0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
24dd0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
24de0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
24df0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
24e00 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
24e10 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
24e20 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
24e30 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
24e40 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
24e50 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
24e60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24e70 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
24e80 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
24e90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
24ea0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
24eb0 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28  gno!=0 );..  if(
24ec0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21   (pPager->state!
24ed0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20  =PAGER_UNLOCK). 
24ee0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72    && (pPager->er
24ef0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
24f00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
24f10 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
24f20 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
24f30 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
24f40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
24f50 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
24f60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67   }..  return pPg
24f70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
24f80 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
24f90 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
24fa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
24fb0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
24fc0 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
24fd0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
24fe0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
24ff0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
25000 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
25010 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
25020 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
25030 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
25040 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
25050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
25060 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
25070 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25080 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
25090 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
250a0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
250b0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
250c0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
250d0 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
250e0 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
250f0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
25100 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
25110 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
25120 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72  nal file has alr
25130 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
25140 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  , ensure that th
25150 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  e.** sub-journal
25160 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f   file is open to
25170 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a  o. If the main j
25180 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70  ournal is not op
25190 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en,.** this func
251a0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
251b0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
251c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
251d0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
251e0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
251f0 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45  n. .** An SQLITE
25200 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
25210 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
25220 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a  d if a call to .
25230 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  ** sqlite3OsOpen
25240 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  () fails..*/.sta
25250 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
25260 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
25270 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
25280 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
25290 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
252a0 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
252b0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
252c0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
252d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
252e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
252f0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
25300 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
25310 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
25320 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
25330 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
25340 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
25350 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
25360 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
25370 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
25380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
253a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
253b0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
253c0 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
253d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
253e0 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
253f0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
25400 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
25410 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25420 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
25430 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
25440 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
25450 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
25460 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
25470 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
25480 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
25490 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
254a0 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
254b0 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
254c0 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
254d0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
254e0 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
254f0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
25500 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
25510 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
25520 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
25530 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
25540 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
25550 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
25560 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
25570 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
25580 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
25590 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
255a0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
255b0 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
255c0 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
255d0 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
255e0 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
255f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
25600 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
25610 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
25620 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
25630 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
25640 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
25650 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
25660 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
25670 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
25680 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
25690 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
256a0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
256b0 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
256c0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
256d0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
256e0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
256f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
25700 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
25710 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
25720 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
25730 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
25740 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
25750 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
25760 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
25770 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
25780 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
25790 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
257a0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
257b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
257c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
257d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
257e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
257f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
25800 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
25810 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
25820 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
25830 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
25840 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
25850 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
25860 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
25870 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
25880 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
25890 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
258a0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
258b0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
258c0 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
258d0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
258e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
258f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
25900 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
25910 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
25920 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
25930 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f  de;.  }..  /* TO
25940 44 4f 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79  DO: Is it really
25950 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74   possible to get
25960 20 68 65 72 65 20 77 69 74 68 20 64 62 53 69 7a   here with dbSiz
25970 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f  eValid==0? If no
25980 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c  t,.  ** the call
25990 20 74 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75   to PagerPagecou
259a0 6e 74 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f  nt() can be remo
259b0 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ved..  */.  test
259c0 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62  case( pPager->db
259d0 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
259e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
259f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
25a00 30 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70  0);..  pPager->p
25a10 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
25a20 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
25a30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
25a40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
25a50 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
25a60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25a70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
25a80 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
25a90 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
25aa0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
25ab0 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  en. */.  if( !is
25ac0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
25ad0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
25ae0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
25af0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
25b00 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
25b10 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
25b20 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
25b30 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
25b40 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  e{.      const i
25b50 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20  nt flags =      
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b70 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  VFS flags to ope
25b80 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
25b90 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
25ba0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
25bb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
25bc0 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
25bd0 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
25be0 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46    (pPager->tempF
25bf0 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ile ? .         
25c00 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
25c10 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
25c20 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
25c30 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20  RNAL):.         
25c40 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
25c50 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
25c60 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51      );.#ifdef SQ
25c70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
25c80 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72  IC_WRITE.      r
25c90 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
25ca0 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
25cb0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
25cc0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
25cd0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
25ce0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
25cf0 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65  ger).      );.#e
25d00 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73  lse.      rc = s
25d10 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
25d20 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
25d30 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
25d40 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
25d50 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  dif.    }.    as
25d60 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
25d70 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
25d80 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
25d90 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  }...  /* Write t
25da0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
25db0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
25dc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
25dd0 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73  open .  ** the s
25de0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
25df0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
25e00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25e10 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K ){.    /* TODO
25e20 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f  : Check if all o
25e30 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c  f these are real
25e40 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ly required. */.
25e50 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
25e60 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
25e70 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  >dbSize;.    pPa
25e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
25e90 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ted = 0;.    pPa
25ea0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
25eb0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
25ec0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
25ed0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
25ee0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
25ef0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
25f00 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
25f10 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
25f20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
25f30 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
25f40 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
25f50 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
25f60 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  >nSavepoint ){. 
25f70 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
25f80 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
25f90 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
25fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25fb0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
25fc0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
25fd0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
25fe0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
25ff0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
26000 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26010 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
26020 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
26030 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
26040 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
26050 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
26060 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
26070 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
26080 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
26090 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
260a0 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
260b0 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
260c0 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
260d0 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
260e0 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
260f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
26100 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
26110 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
26120 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
26130 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
26140 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
26150 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
26160 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
26170 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
26180 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
26190 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
261a0 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f  orary or in-memo
261b0 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65  ry file and, the
261c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
261d0 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69   .** opened if i
261e0 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  t has not been a
261f0 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65  lready. For a te
26200 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68  mporary file, th
26210 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66  e opening .** of
26220 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26230 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
26240 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20  til there is an 
26250 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a  actual need to .
26260 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ** write to the 
26270 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57  journal. TODO: W
26280 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72  hy handle tempor
26290 61 72 79 20 66 69 6c 65 73 20 64 69 66 66 65 72  ary files differ
262a0 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20  ently?.**.** If 
262b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
262c0 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69   is opened (or i
262d0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
262e0 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a  open), then a.**
262f0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
26300 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
26310 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a  e start of it..*
26320 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26330 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
26340 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
26350 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
26360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
26370 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
26380 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
26390 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
263a0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
263b0 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
263c0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
263d0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
263e0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
263f0 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
26400 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  File );..    /* 
26410 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
26420 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
26430 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
26440 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
26450 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 74  eter.    ** is t
26460 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
26470 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
26480 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
26490 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
264a0 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
264b0 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
264c0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
264d0 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
264e0 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63  USIVE.    ** loc
264f0 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
26500 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
26510 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
26520 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
26530 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
26540 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
26550 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
26560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26570 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
26580 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
26590 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  RVED;.      if( 
265a0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
265b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
265c0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
265d0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
265e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
265f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
26600 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73 20 77  required locks w
26610 65 72 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ere successfully
26620 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65 6e 20   obtained, open 
26630 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
26640 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77 72 69 74  ** file and writ
26650 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
26660 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f 20 69 74  nal-header to it
26670 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26690 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
266a0 72 6e 61 6c 0a 20 20 20 20 20 26 26 20 70 50 61  rnal.     && pPa
266b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
266c0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
266d0 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 29 7b 0a  ODE_OFF .    ){.
266e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
266f0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
26700 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
26710 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28  else if( isOpen(
26720 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
26730 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26740 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
26750 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
26760 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
26770 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
26780 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73  ess mode the las
26790 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
267a0 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
267b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
267c0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
267d0 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
267e0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
267f0 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
26800 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
26810 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
26820 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
26830 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74  and either was t
26840 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
26850 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65  tes or its heade
26860 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65  r was.    ** ove
26870 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65  rwritten with ze
26880 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
26890 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
268a0 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
268b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
268c0 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a  bOrigSize==0 );.
268d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
268e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
268f0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 );.    rc = pa
26900 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
26910 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
26920 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52   PAGERTRACE(("TR
26930 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
26940 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
26950 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69  ));.  assert( !i
26960 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
26970 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  d) || pPager->jo
26980 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
26990 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
269a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
269b0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67  *.** Mark a sing
269c0 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20  le data page as 
269d0 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70  writeable. The p
269e0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
269f0 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  nto the .** main
26a00 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
26a10 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69  journal as requi
26a20 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  red. If the page
26a30 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
26a40 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a  .** one of the j
26a50 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72  ournals, the cor
26a60 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
26a70 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a  s set in the .**
26a80 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
26a90 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65  l bitvec and the
26aa0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
26ab0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
26ac0 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f  vecs.** of any o
26ad0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61  pen savepoints a
26ae0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
26af0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
26b00 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
26b10 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
26b20 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
26b30 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
26b40 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
26b50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26b60 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
26b70 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
26b80 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
26b90 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20  >errCode ){ .   
26ba0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
26bb0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
26bc0 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
26bd0 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
26be0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
26bf0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
26c00 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
26c10 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
26c20 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61  E(pPg);..  /* Ma
26c30 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
26c40 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
26c50 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
26c60 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
26c70 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
26c80 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
26c90 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
26ca0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
26cb0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
26cc0 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a  );.  if( pageInJ
26cd0 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
26ce0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
26cf0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50 61  (pPg) ){.    pPa
26d00 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
26d10 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
26d20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
26d30 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
26d40 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
26d50 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
26d60 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
26d70 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
26d80 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
26d90 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
26da0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
26db0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
26dc0 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
26dd0 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
26de0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
26df0 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
26e00 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
26e10 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
26e20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
26e30 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
26e40 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
26e50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26e60 65 72 42 65 67 69 6e 28 70 50 61 67 65 72 2c 20  erBegin(pPager, 
26e70 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
26e80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26e90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26ea0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
26eb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
26ec0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
26ed0 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
26ee0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
26ef0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
26f00 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26  nal.          &&
26f10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26f20 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
26f30 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
26f40 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26f50 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
26f60 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
26f70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
26f80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
26f90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
26fa0 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a  odified = 1;.  .
26fb0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
26fc0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
26fd0 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
26fe0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
26ff0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
27000 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
27010 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
27020 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
27030 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
27040 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
27050 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
27060 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
27070 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
27080 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61    */.    if( !pa
27090 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
270a0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
270b0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
270c0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
270d0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
270e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  ze ){.        u3
270f0 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
27100 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
27110 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
27120 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
27130 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
27140 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
27150 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
27160 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
27170 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
27180 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
27190 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
271a0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
271b0 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
271c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
271d0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
271e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
271f0 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44      pData2 = COD
27200 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
27210 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
27220 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
27230 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
27240 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
27250 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  2);.        rc =
27260 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
27270 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
27280 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
27290 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
272a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
272b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
272c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
272d0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
272e0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
272f0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
27320 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
27330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
27340 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
27350 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
27360 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d  ize+4;.        }
27370 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
27380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27390 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
273a0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
273b0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
273c0 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
273d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
273e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
273f0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
27400 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
27410 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
27420 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
27430 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
27450 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
27460 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27470 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
27480 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
27490 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
274a0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
274b0 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
274c0 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
274d0 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
274e0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
274f0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
27500 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
27510 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
27520 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
27530 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
27540 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
27550 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
27560 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
27570 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
27580 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
27590 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
275a0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
275b0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
275c0 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
275d0 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
275e0 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
275f0 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
27600 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
27610 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
27620 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
27630 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
27640 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
27650 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
27660 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
27670 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
27680 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
27690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
276a0 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
276b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
276c0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
276d0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
276e0 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
276f0 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
27700 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
27710 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
27720 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
27730 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
27740 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
27750 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
27760 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
27770 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
27780 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
27790 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
277a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
277b0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
277c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
277d0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
277e0 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
277f0 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
27800 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27820 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
27830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
27840 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
27850 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
27860 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
27870 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
27880 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27890 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
278a0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
278b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
278c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
278d0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
278e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
278f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27900 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
27910 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
27920 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
27930 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
27940 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
27950 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
27980 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
27990 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
279a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
279b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
279c0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
279d0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
279e0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
279f0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
27a00 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
27a10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
27a20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
27a30 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
27a40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27a50 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
27a60 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
27a70 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
27a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27a90 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
27aa0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
27ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
27ac0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
27ad0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
27ae0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27af0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
27b00 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
27b10 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
27b20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
27b30 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
27b40 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
27b50 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
27b60 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
27b70 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
27b80 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
27b90 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
27ba0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
27bb0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
27bc0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
27bd0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
27be0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
27bf0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
27c00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27c10 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
27c20 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
27c30 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
27c40 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
27c50 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
27c60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
27c70 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
27c80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
27c90 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
27ca0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
27cb0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
27cc0 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
27cd0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
27ce0 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
27cf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
27d00 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
27d10 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
27d20 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
27d30 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
27d40 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
27d50 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
27d60 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
27d70 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
27d80 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
27d90 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
27da0 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
27db0 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
27dc0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
27dd0 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
27de0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
27df0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
27e00 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
27e10 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
27e20 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
27e30 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
27e40 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
27e50 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
27e60 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
27e70 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
27e80 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
27e90 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
27ea0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
27eb0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
27ec0 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
27ed0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
27ee0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
27ef0 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
27f00 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
27f10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
27f20 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
27f30 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
27f40 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
27f50 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
27f60 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
27f70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
27f80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
27f90 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
27fa0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
27fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
27fc0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
27fd0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
27fe0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
27ff0 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
28000 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
28010 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
28020 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28030 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
28040 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
28050 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
28060 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
28070 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
28080 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
28090 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
280a0 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
280b0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
280c0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
280d0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
280e0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
280f0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
28100 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28110 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
28120 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
28130 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
28140 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
28150 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28160 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
28170 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
28180 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28190 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
281a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
281b0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
281c0 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
281d0 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
281e0 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
281f0 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
28200 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
28210 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
28220 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
28230 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
28240 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
28250 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
28260 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
28270 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
28280 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
28290 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
282a0 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
282b0 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
282c0 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
282d0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
282e0 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
282f0 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
28300 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
28310 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
28320 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
28330 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
28340 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
28350 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
28360 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
28370 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
28380 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
28390 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
283a0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71  1)) + 1;..    sq
283b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
283c0 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
283d0 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
283e0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
283f0 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
28400 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
28410 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
28420 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
28430 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
28440 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
28450 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
28460 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
28470 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
28480 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
28490 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
284a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
284b0 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
284c0 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
284d0 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
284e0 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
284f0 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
28500 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
28510 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
28520 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
28530 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
28540 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
28550 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
28560 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
28570 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
28580 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
28590 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
285a0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
285b0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
285c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
285d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
285e0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
285f0 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
28600 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
28610 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28620 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
28630 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
28640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28650 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
28660 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
28670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
28680 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
28690 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
286a0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
286b0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nc);.           
286c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
286d0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
286e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
286f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28700 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
28710 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
28720 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
28730 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28740 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
28750 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
28760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
28770 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
28780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
28790 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
287a0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
287b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
287c0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
287d0 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
287e0 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
287f0 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
28800 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
28810 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
28820 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
28830 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
28840 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
28850 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
28860 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
28870 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
28880 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
28890 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
288a0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
288b0 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
288c0 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
288d0 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
288e0 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
288f0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
28900 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
28910 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
28920 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
28930 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26  assert( !MEMDB &
28940 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
28950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
28960 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
28970 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b  && needSync; ii+
28980 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64  +){.        PgHd
28990 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72  r *pPage = pager
289a0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
289b0 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20  pg1+ii);.       
289c0 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
289d0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66          pPage->f
289e0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
289f0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
28a00 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
28a10 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
28a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28a30 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
28a40 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
28a50 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
28a60 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
28a70 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ync==1 );.    pP
28a80 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
28a90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
28aa0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
28ab0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
28ac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28ad0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
28ae0 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
28af0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
28b00 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
28b10 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
28b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28b30 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
28b40 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
28b50 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
28b60 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
28b70 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
28b80 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
28b90 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
28ba0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
28bb0 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
28bc0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66  .  return pPg->f
28bd0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
28be0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
28bf0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
28c00 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
28c10 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
28c20 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
28c30 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
28c40 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
28c50 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
28c60 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
28c70 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
28c80 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
28c90 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
28ca0 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
28cb0 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
28cc0 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20  ** the page has 
28cd0 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20  been added as a 
28ce0 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65  leaf of the free
28cf0 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a  list and so its.
28d00 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f  ** content no lo
28d10 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a  nger matters..**
28d20 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
28d30 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
28d40 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
28d50 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
28d60 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
28d70 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
28d80 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67   unused. The pag
28d90 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
28da0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
28db0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
28dc0 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
28dd0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
28de0 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
28df0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  s optimization c
28e00 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  an quadruple the
28e10 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
28e20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61  .** DELETE opera
28e30 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tions..*/.void s
28e40 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
28e50 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
28e60 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
28e70 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
28e80 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
28e90 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
28ea0 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
28eb0 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  point==0 ){.    
28ec0 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
28ed0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
28ee0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
28ef0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
28f00 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52  ger)));.    IOTR
28f10 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
28f20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
28f30 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50  g->pgno)).    pP
28f40 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
28f50 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69  R_DONT_WRITE;.#i
28f60 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
28f70 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
28f80 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
28f90 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
28fa0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
28fb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28fc0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
28fd0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
28fe0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
28ff0 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e  se file .** chan
29000 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72  ge-counter, stor
29010 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62  ed as a 4-byte b
29020 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
29030 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a  r starting at .*
29040 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  * byte offset 24
29050 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
29060 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
29070 20 69 73 44 69 72 65 63 74 20 66 6c 61 67 20 69   isDirect flag i
29080 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  s zero, then thi
29090 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c  s is done by cal
290a0 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
290b0 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
290c0 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64  page 1, then mod
290d0 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
290e0 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  nts of the.** pa
290f0 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73  ge data. In this
29100 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77   case the file w
29110 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77  ill be updated w
29120 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
29130 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
29140 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
29150 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 20  ** The isDirect 
29160 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65  flag may only be
29170 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
29180 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d   library was com
29190 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  piled.** with th
291a0 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
291b0 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63  ATOMIC_WRITE mac
291c0 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74  ro defined. In t
291d0 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20  his case,.** if 
291e0 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d  isDirect is non-
291f0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
29200 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
29210 75 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79  updated directly
29220 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61  .** by writing a
29230 6e 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f  n updated versio
29240 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e  n of page 1 usin
29250 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  g a call to the 
29260 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69  .** sqlite3OsWri
29270 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  te() function..*
29280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
29290 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
292a0 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
292b0 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63  ger, int isDirec
292c0 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63  tMode){.  int rc
292d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
292e0 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20   /* Declare and 
292f0 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74  initialize const
29300 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44  ant integer 'isD
29310 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20  irect'. If the. 
29320 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65   ** atomic-write
29330 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
29340 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73   enabled in this
29350 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44   build, then isD
29360 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e  irect.  ** is in
29370 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
29380 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
29390 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
293a0 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  e parameter.  **
293b0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
293c0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  n. Otherwise, it
293d0 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74   is always set t
293e0 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  o zero..  **.  *
293f0 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
29400 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63  at if the atomic
29410 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
29420 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ion is not.  ** 
29430 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
29440 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d  le time, the com
29450 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74  piler can omit t
29460 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a  he tests of.  **
29470 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f   'isDirect' belo
29480 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  w, as well as th
29490 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64  e block enclosed
294a0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66   in the.  ** "if
294b0 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f  ( isDirect )" co
294c0 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ndition..  */.#i
294d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
294e0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
294f0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 44  .  const int isD
29500 69 72 65 63 74 20 3d 20 30 3b 0a 20 20 61 73 73  irect = 0;.  ass
29510 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64  ert( isDirectMod
29520 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  e==0 );.  UNUSED
29530 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72  _PARAMETER(isDir
29540 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  ectMode);.#else.
29550 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 44 69    const int isDi
29560 72 65 63 74 20 3d 20 69 73 44 69 72 65 63 74 4d  rect = isDirectM
29570 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ode;.#endif..  a
29580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
29590 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
295a0 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70  RVED );.  if( !p
295b0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
295c0 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72  ntDone && pPager
295d0 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
295e0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29600 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
29610 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33  page 1 */.    u3
29620 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
29630 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
29640 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
29650 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
29660 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ield */..    ass
29670 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
29680 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e  mpFile && isOpen
29690 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
296a0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
296b0 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
296c0 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
296d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
296e0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
296f0 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
29700 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72    assert( pPgHdr
29710 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
29720 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
29730 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20  If page one was 
29740 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66  fetched successf
29750 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66  ully, and this f
29760 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  unction is not. 
29770 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20     ** operating 
29780 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20  in direct-mode, 
29790 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74  make page 1 writ
297a0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
297b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
297c0 4f 4b 20 26 26 20 21 69 73 44 69 72 65 63 74 20  OK && !isDirect 
297d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
297e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
297f0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
29800 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
29820 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
29830 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
29840 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
29850 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
29860 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  .      change_co
29870 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
29880 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61  et4byte((u8*)pPa
29890 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
298a0 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63  ;.      change_c
298b0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
298c0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
298d0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
298e0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
298f0 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ter);..      /* 
29900 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69  If running in di
29910 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65  rect mode, write
29920 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
29930 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66   page 1 to the f
29940 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
29950 28 20 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20  ( isDirect ){.  
29960 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
29970 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d   *zBuf = pPgHdr-
29980 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >pData;.        
29990 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
299a0 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a  dbFileSize>0 );.
299b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
299c0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
299d0 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
299e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
299f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
29a00 20 20 20 2f 2a 20 49 66 20 65 76 65 72 79 74 68     /* If everyth
29a10 69 6e 67 20 77 6f 72 6b 65 64 2c 20 73 65 74 20  ing worked, set 
29a20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
29a30 6f 6e 65 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20  one flag. */.   
29a40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29a60 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
29a70 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
29a80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29a90 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
29aa0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
29ab0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
29ac0 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
29ad0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29ae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
29af0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74  the pager file t
29b00 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
29b10 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
29b20 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f  emory files.** o
29b30 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
29b40 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
29b50 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
29b60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
29b70 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65  called on a page
29b80 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69  r for which it i
29b90 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a  s a no-op, this.
29ba0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
29bb0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  rns SQLITE_OK. O
29bc0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20  therwise, an IO 
29bd0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29be0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
29bf0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
29c00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29c10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29c40 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 4d   code */.  if( M
29c50 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e  EMDB || pPager->
29c60 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
29c70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29c80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
29c90 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
29ca0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
29cb0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
29cc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
29ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29cf0 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
29d00 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
29d10 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
29d20 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
29d30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
29d40 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
29d50 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
29d60 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
29d70 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
29d80 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
29d90 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
29da0 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
29db0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
29dc0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
29dd0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
29de0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
29df0 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a  nsures that:.**.
29e00 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
29e10 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
29e20 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74  counter is updat
29e30 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a  ed,.**   * the j
29e40 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
29e50 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f   (unless the ato
29e60 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
29e70 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c  zation is used),
29e80 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74  .**   * all dirt
29e90 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  y pages are writ
29ea0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
29eb0 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20  ase file, .**   
29ec0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
29ed0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
29ee0 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
29ef0 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  and.**   * the d
29f00 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
29f10 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ced. .**.** The 
29f20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20  only thing that 
29f30 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
29f40 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
29f50 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  n is to finalize
29f60 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72   .** (delete, tr
29f70 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
29f80 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66  he first part of
29f90 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ) the journal fi
29fa0 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74  le (or .** delet
29fb0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
29fc0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
29fd0 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
29fe0 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
29ff0 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
2a000 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
2a010 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
2a020 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
2a030 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
2a040 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
2a050 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
2a060 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  the final parame
2a070 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69  ter - noSync - i
2a080 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2a090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2a0a0 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20  tself.** is not 
2a0b0 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c  synced. The call
2a0c0 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c  er must call sql
2a0d0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20  ite3PagerSync() 
2a0e0 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73  directly to.** s
2a0f0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
2a100 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
2a110 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65  ling CommitPhase
2a120 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20  Two() to delete 
2a130 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2a140 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
2a150 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a160 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2a170 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  One(.  Pager *pP
2a180 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
2a190 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2a1a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
2a1b0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a1d0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
2a1e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
2a1f0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53  ame */.  int noS
2a200 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
2a210 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a220 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79   to omit the xSy
2a230 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  nc on the db fil
2a240 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2a250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2a260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a270 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
2a280 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
2a290 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
2a2a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2a2b0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2a2c0 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53  ACE(("DATABASE S
2a2d0 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
2a2e0 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64  ster=%s nSize=%d
2a2f0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
2a300 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2a310 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
2a320 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20  dbSize));..  /* 
2a330 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
2a340 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
2a350 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
2a360 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
2a370 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2a380 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
2a390 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
2a3a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
2a3b0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  .  if( MEMDB && 
2a3c0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2a3d0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
2a3e0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
2a3f0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
2a400 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
2a410 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
2a420 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50 61 67  R_SYNCED && pPag
2a430 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2a440 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  {..    /* The fo
2a450 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70  llowing block up
2a460 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
2a470 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c  -counter. Exactl
2a480 79 20 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20  y how it.    ** 
2a490 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64  does this depend
2a4a0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
2a4b0 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75  not the atomic-u
2a4c0 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
2a4d0 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  on.    ** was en
2a4e0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
2a4f0 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
2a500 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
2a510 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  eets the .    **
2a520 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
2a530 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
2a540 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a  ration: .    **.
2a550 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20      **    * The 
2a560 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2a570 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
2a580 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
2a590 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  or.    **      b
2a5a0 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61  locks of size pa
2a5b0 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20  ge-size, and .  
2a5c0 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
2a5d0 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
2a5e0 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
2a5f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
2a600 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45  nd.    **    * E
2a610 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
2a620 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2a630 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
2a640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2a650 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2a660 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2a670 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
2a680 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2a690 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
2a6a0 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
2a6b0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
2a6c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2a6d0 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
2a6e0 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f  change.    ** co
2a6f0 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
2a700 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
2a710 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2a720 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
2a730 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
2a740 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69  pplicable to thi
2a750 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  s transaction, c
2a760 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  all sqlite3Journ
2a770 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a  alCreate().    *
2a780 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * to make sure t
2a790 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a7a0 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65  has actually bee
2a7b0 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  n created, then 
2a7c0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  call.    ** page
2a7d0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2a7e0 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2a7f0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2a800 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
2a810 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20      ** mode. .  
2a820 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
2a830 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70  rwise, if the op
2a840 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f  timization is bo
2a850 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61  th enabled and a
2a860 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a  pplicable,.    *
2a870 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
2a880 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2a890 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2a8a0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2a8b0 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64  ter.    ** in 'd
2a8c0 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20  irect' mode. In 
2a8d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2a8e0 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
2a8f0 6e 65 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20  never be.    ** 
2a900 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
2a910 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
2a920 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2a930 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2a940 5f 57 52 49 54 45 0a 20 20 20 20 50 67 48 64 72  _WRITE.    PgHdr
2a950 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
2a960 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2a970 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
2a980 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2a990 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2a9a0 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20  _OFF );.    if( 
2a9b0 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70  !zMaster && isOp
2a9c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2a9d0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2a9e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
2a9f0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
2aa00 65 72 29 20 0a 20 20 20 20 20 26 26 20 70 50 61  er) .     && pPa
2aa10 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
2aa20 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a  ger->dbFileSize.
2aa30 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67       && (0==(pPg
2aa40 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2aa50 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2aa60 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30  ->pPCache)) || 0
2aa70 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20  ==pPg->pDirty). 
2aa80 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55     ){.      /* U
2aa90 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
2aaa0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
2aab0 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d   via the direct-
2aac0 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68  write method. Th
2aad0 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  e .      ** foll
2aae0 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
2aaf0 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65  modify the in-me
2ab00 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
2ab10 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20  ion of page 1 . 
2ab20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75       ** to inclu
2ab30 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20 63  de the updated c
2ab40 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e  hange counter an
2ab50 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67  d then write pag
2ab60 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69  e 1 .      ** di
2ab70 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
2ab80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63  tabase file. Bec
2ab90 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
2aba0 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20  ic-write .      
2abb0 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  ** property of t
2abc0 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
2abd0 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66  tem, this is saf
2abe0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2abf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2ac00 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2ac10 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2ac20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2ac30 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2ac40 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
2ac50 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
2ac60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ac70 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2ac80 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2ac90 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2aca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2acb0 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70  #else.    rc = p
2acc0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2acd0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2ace0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
2acf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ad00 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2ad10 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2ad20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
2ad30 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
2ad40 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
2ad50 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
2ad60 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20  ll pages.    ** 
2ad70 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
2ad80 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
2ad90 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
2ada0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2adb0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68  .    ** file. Th
2adc0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
2add0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
2ade0 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  m mode..    **. 
2adf0 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61     ** Before rea
2ae00 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77  ding the pages w
2ae10 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
2ae20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2ae30 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
2ae40 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
2ae50 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69  dbSize, set dbSi
2ae60 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
2ae70 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  alue.    ** that
2ae80 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20   it took at the 
2ae90 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
2aea0 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  nsaction. Otherw
2aeb0 69 73 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ise, the.    ** 
2aec0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2aed0 50 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72  PagerGet() retur
2aee0 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69  n zeroed pages i
2aef0 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a  nstead of .    *
2af00 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20 66  * reading data f
2af10 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2af20 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   file..    */.#i
2af30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2af40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2af50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2af60 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72  ize<pPager->dbOr
2af70 69 67 53 69 7a 65 0a 20 20 20 20 20 26 26 20 70  igSize.     && p
2af80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2af90 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2afa0 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 29  LMODE_OFF .    )
2afb0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20  {.      Pgno i; 
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2aff0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
2b000 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70  const Pgno iSkip
2b010 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
2b020 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e  (pPager); /* Pen
2b030 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a  ding lock page *
2b040 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67  /.      const Pg
2b050 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  no dbSize = pPag
2b060 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20  er->dbSize;     
2b070 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d    /* Database im
2b080 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20  age size */ .   
2b090 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2b0a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
2b0b0 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f  igSize;.      fo
2b0c0 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69  r( i=dbSize+1; i
2b0d0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
2b0e0 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
2b0f0 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
2b100 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
2b110 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
2b120 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  i) && i!=iSkip )
2b130 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64  {.          PgHd
2b140 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  r *pPage;       
2b150 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
2b160 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
2b170 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b180 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2b190 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, i, &pPage);. 
2b1a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2b1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2b1c0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2b1d0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2b1e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b1f0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29  agerWrite(pPage)
2b200 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2b210 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2b220 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2b230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b240 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2b250 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2b260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b270 7d 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  } .      pPager-
2b280 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65  >dbSize = dbSize
2b290 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2b2a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2b2b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2b2c0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
2b2d0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
2b2e0 20 6d 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20   master .    ** 
2b2f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2b300 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
2b310 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
2b320 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2b330 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d  .    ** or if zM
2b340 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e  aster is NULL (n
2b350 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
2b360 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  ), then this cal
2b370 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
2b380 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72    */.    rc = wr
2b390 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
2b3a0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
2b3b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2b3c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2b3d0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2b3e0 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
2b3f0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2b400 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f  file. If the ato
2b410 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
2b420 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ization is being
2b430 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68  .    ** used, th
2b440 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  is call will not
2b450 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72   create the jour
2b460 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66  nal file or perf
2b470 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72  orm any.    ** r
2b480 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20  eal IO..    */. 
2b490 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
2b4a0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2b4b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b4c0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2b4d0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2b4e0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
2b4f0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
2b500 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b510 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ile. */.    rc =
2b520 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2b530 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63 61  elist(sqlite3Pca
2b540 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2b550 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a  ger->pPCache));.
2b560 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2b580 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2b590 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
2b5a0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f  );.      goto co
2b5b0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2b5c0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xit;.    }.    s
2b5d0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
2b5e0 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
2b5f0 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ache);..    /* I
2b600 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
2b610 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
2b620 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
2b630 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
2b640 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70     ** then use p
2b650 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f  ager_truncate to
2b660 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20   grow or shrink 
2b670 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  the file here.. 
2b680 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
2b690 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50  ager->dbSize!=pP
2b6a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2b6b0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2b6c0 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  New = pPager->db
2b6d0 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e  Size - (pPager->
2b6e0 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a  dbSize==PAGER_MJ
2b6f0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
2b700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2b710 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2b720 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
2b730 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b740 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
2b750 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , nNew);.      i
2b760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b770 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2b780 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2b790 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
2b7a0 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64  ally, sync the d
2b7b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2b7c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
2b7d0 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
2b7e0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
2b7f0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2b800 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2b810 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2b820 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
2b830 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
2b840 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
2b850 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2b860 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
2b870 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65   }..commit_phase
2b880 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 69 66 28  _one_exit:.  if(
2b890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
2b8a0 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  R_BLOCKED ){.   
2b8b0 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   /* pager_incr_c
2b8c0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d  hangecounter() m
2b8d0 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  ay attempt to ob
2b8e0 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
2b8f0 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 74 6f  e.    ** lock to
2b900 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
2b910 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52   and return IOER
2b920 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73  R_BLOCKED. But s
2b930 69 6e 63 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  ince .    ** the
2b940 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
2b950 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63  the cache is inc
2b960 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73  onsistent, it is
2b970 0a 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74  .    ** better t
2b980 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
2b990 42 55 53 59 2e 0a 20 20 20 20 2a 2a 2f 0a 20 20  BUSY..    **/.  
2b9a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
2b9b0 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  SY;.  }.  return
2b9c0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
2b9d0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2b9e0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
2b9f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2ba00 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  as been complete
2ba10 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f  ly.** updated to
2ba20 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61   reflect the cha
2ba30 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65  nges made by the
2ba40 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2ba50 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63  tion and.** sync
2ba60 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20  ed to disk. The 
2ba70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69  journal file sti
2ba80 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ll exists in the
2ba90 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
2baa0 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20   though, and if 
2bab0 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
2bac0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
2bad0 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  t will eventuall
2bae0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20  y.** be used as 
2baf0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
2bb00 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  d the current tr
2bb10 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64  ansaction rolled
2bb20 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
2bb30 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c  s function final
2bb40 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
2bb50 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79   file, either by
2bb60 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74   deleting, .** t
2bb70 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72  runcating or par
2bb80 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69  tially zeroing i
2bb90 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  t, so that it ca
2bba0 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a  nnot be used .**
2bbb0 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   for hot-journal
2bbc0 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20   rollback. Once 
2bbd0 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65  this is done the
2bbe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
2bbf0 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63  ** irrevocably c
2bc00 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
2bc10 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2bc20 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
2bc30 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2bc40 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a   and the pager.*
2bc50 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65  * moves into the
2bc60 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74   error state. Ot
2bc70 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
2bc80 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
2bc90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2bca0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
2bcb0 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
2bcc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2bcd0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2bce0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2bcf0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2bd00 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20   Do not proceed 
2bd10 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
2bd20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
2bd30 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
2bd40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2bd50 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
2bd60 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2bd70 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  de;.  }..  /* Th
2bd80 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2bd90 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
2bda0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
2bdb0 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74   not in at least
2bdc0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .  ** PAGER_RESE
2bdd0 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e 64 20  RVED state. And 
2bde0 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20 6e 65  indeed SQLite ne
2bdf0 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e 20 42  ver does this. B
2be00 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69  ut it is.  ** ni
2be10 63 65 20 74 6f 20 68 61 76 65 20 74 68 69 73 20  ce to have this 
2be20 64 65 66 65 6e 73 69 76 65 20 62 6c 6f 63 6b 20  defensive block 
2be30 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  here anyway..  *
2be40 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2be50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
2be60 52 5f 52 45 53 45 52 56 45 44 29 20 29 7b 0a 20  R_RESERVED) ){. 
2be70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2be80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
2be90 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * An optimizatio
2bea0 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  n. If the databa
2beb0 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61  se was not actua
2bec0 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72  lly modified dur
2bed0 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72  ing.  ** this tr
2bee0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70  ansaction, the p
2bef0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
2bf00 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
2bf10 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73  e and is.  ** us
2bf20 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a  ing persistent j
2bf30 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68  ournals, then th
2bf40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2bf50 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a   no-op..  **.  *
2bf60 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74  * The start of t
2bf70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bf80 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
2bf90 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72  ns a single jour
2bfa0 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72  nal .  ** header
2bfb0 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66   with the nRec f
2bfc0 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49  ield set to 0. I
2bfd0 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c  f such a journal
2bfe0 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a   is used as.  **
2bff0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64   a hot-journal d
2c000 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
2c010 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68  l rollback, 0 ch
2c020 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
2c030 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  de.  ** to the d
2c040 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
2c050 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2c060 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f  d to zero the jo
2c070 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
2c080 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  er. Since the pa
2c090 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
2c0a0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20  ive mode, there 
2c0b0 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20  is no need.  ** 
2c0c0 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b  to drop any lock
2c0d0 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  s either..  */. 
2c0e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
2c0f0 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50  odified==0 && pP
2c100 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2c110 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65  ode .   && pPage
2c120 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2c130 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2c140 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20  E_PERSIST.  ){. 
2c150 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c160 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
2c170 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
2c180 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 65 74  ager) );.    ret
2c190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c1a0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2c1b0 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  (("COMMIT %d\n",
2c1c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2c1d0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
2c1e0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2c1f0 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d  ER_SYNCED || MEM
2c200 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  DB || !pPager->d
2c210 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 72  bModified );.  r
2c220 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
2c230 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2c240 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2c250 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ter);.  return p
2c260 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2c270 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
2c280 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
2c290 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74 61 62  anges. The datab
2c2a0 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
2c2b0 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
2c2c0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ode..**.** This 
2c2d0 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
2c2e0 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a  s two tasks:.**.
2c2f0 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c 73  **   1) It rolls
2c300 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61   back the journa
2c310 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e  l file, restorin
2c320 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  g all database f
2c330 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  ile and .**     
2c340 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2c350 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 73 74   pages to the st
2c360 61 74 65 20 74 68 65 79 20 77 65 72 65 20 69 6e  ate they were in
2c370 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
2c380 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77 61  ction.**      wa
2c390 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a  s opened, and.**
2c3a0 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c 69 7a     2) It finaliz
2c3b0 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
2c3c0 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69 74 20  ile, so that it 
2c3d0 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20  is not used for 
2c3e0 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  hot.**      roll
2c3f0 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f 69 6e  back at any poin
2c400 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
2c410 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74  .**.** subject t
2c420 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2c430 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a 0a  qualifications:.
2c440 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 6a  **.** * If the j
2c450 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2c460 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68 65 6e  ot yet open when
2c470 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2c480 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74  s called,.**   t
2c490 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73 20  hen only (2) is 
2c4a0 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74 68  performed. In th
2c4b0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
2c4c0 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   no journal file
2c4d0 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62 61  .**   to roll ba
2c4e0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69  ck..**.** * If i
2c4f0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2c500 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2c510 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74 61  TE_FULL, then ta
2c520 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20 20 20  sk (1) is .**   
2c530 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20 73 75  performed. If su
2c540 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b 20 28  ccessful, task (
2c550 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  2). Regardless o
2c560 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a  f the outcome.**
2c570 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20 74 68     of either, th
2c580 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
2c590 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2c5a0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
2c5b0 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65 69  er.**   (i.e. ei
2c5c0 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
2c5d0 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52 52  R or SQLITE_CORR
2c5e0 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  UPT)..**.** * If
2c5f0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
2c600 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
2c610 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2c620 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68 65 72  mpt (1). Whether
2c630 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31 29  .**   or not (1)
2c640 20 69 73 20 73 75 63 63 75 73 73 66 75 6c 2c 20   is succussful, 
2c650 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28 32 29  also attempt (2)
2c660 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2c670 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51 4c   return.**   SQL
2c680 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
2c690 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  e, enter the err
2c6a0 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
2c6b0 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 0a 2a  urn the first .*
2c6c0 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65 20 65  *   error code e
2c6d0 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a  ncountered. .**.
2c6e0 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
2c6f0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  e there is no ch
2c700 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 64 61  ance that the da
2c710 74 61 62 61 73 65 20 77 61 73 20 77 72 69 74 74  tabase was writt
2c720 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20  en to. .**   So 
2c730 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  is safe to final
2c740 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
2c750 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65  file even if the
2c760 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20 20   playback .**   
2c770 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20 66 61  (operation 1) fa
2c780 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20 74 68  iled. However th
2c790 65 20 70 61 67 65 72 20 6d 75 73 74 20 65 6e 74  e pager must ent
2c7a0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2c7b0 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65 20 63  te.**   as the c
2c7c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
2c7d0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 61  n-memory cache a
2c7e0 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74 2e 0a  re now suspect..
2c7f0 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c  **.** * Finally,
2c800 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45 58 43   if in PAGER_EXC
2c810 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
2c820 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
2c830 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d 70  Only.**   attemp
2c840 74 20 28 32 29 20 69 66 20 28 31 29 20 69 73 20  t (2) if (1) is 
2c850 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65 74 75  successful. Retu
2c860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
2c870 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 20  successful,.**  
2c880 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74 65 72   otherwise enter
2c890 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2c8a0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
2c8b0 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
2c8c0 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69 6e  the .**   failin
2c8d0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  g operation..**.
2c8e0 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
2c8f0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
2c900 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ile may have bee
2c910 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 53 6f  n written to. So
2c920 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c 61   if the.**   pla
2c930 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
2c940 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65 64 20  did not succeed 
2c950 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20  it would not be 
2c960 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65  safe to finalize
2c970 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  .**   the journa
2c980 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65 64 73  l file. It needs
2c990 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e 20 74   to be left in t
2c9a0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2c9b0 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d 65  o that.**   some
2c9c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
2c9d0 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72 65 73  an use it to res
2c9e0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
2c9f0 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a 20 20  e state (by.**  
2ca00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2ca10 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73  lback)..*/.int s
2ca20 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
2ca30 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
2ca40 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2ca50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2ca60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ca70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
2ca80 41 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c 4c  AGERTRACE(("ROLL
2ca90 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
2caa0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2cab0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 62   if( !pPager->db
2cac0 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69 73 4f  Modified || !isO
2cad0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2cae0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
2caf0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2cb00 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2cb10 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2cb20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
2cb30 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
2cb40 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
2cb50 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
2cb60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2cb70 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
2cb80 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
2cb90 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2cba0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
2cbb0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
2cbc0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
2cbd0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
2cbe0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
2cbf0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 20  ESERVED ){.     
2cc00 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
2cc10 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
2cc20 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
2cc30 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65        rc2 = page
2cc40 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
2cc50 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
2cc60 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
2cc70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cc80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cc90 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
2cca0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2ccb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2ccc0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2ccd0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
2cce0 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
2ccf0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2cd00 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  eValid = 0;.    
2cd10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  }..    /* If an 
2cd20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
2cd30 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
2cd40 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
2cd50 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
2cd60 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  .    ** cache. S
2cd70 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
2cd80 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
2cd90 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
2cda0 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65  error .    ** pe
2cdb0 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f  rsistent..    */
2cdc0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2cdd0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2cde0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2cdf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2ce00 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2ce10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2ce20 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
2ce30 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
2ce40 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
2ce50 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
2ce60 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
2ce70 75 38 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  u8 sqlite3PagerI
2ce80 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
2ce90 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2cea0 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
2ceb0 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
2cec0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2ced0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2cee0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
2cef0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
2cf00 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
2cf10 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2cf20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
2cf30 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
2cf40 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
2cf50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
2cf60 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2cf70 73 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  s to the specifi
2cf80 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  ed page..*/.int 
2cf90 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2cfa0 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67 65 20  Refcount(DbPage 
2cfb0 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
2cfc0 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  n sqlite3PcacheP
2cfd0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67  ageRefcount(pPag
2cfe0 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  e);.}..#ifdef SQ
2cff0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
2d000 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2d010 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
2d020 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
2d030 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
2d040 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
2d050 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2d060 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
2d070 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74  ;.  a[0] = sqlit
2d080 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2d090 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2d0a0 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69  );.  a[1] = sqli
2d0b0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
2d0c0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2d0d0 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71  he);.  a[2] = sq
2d0e0 6c 69 74 65 33 50 63 61 63 68 65 47 65 74 43 61  lite3PcacheGetCa
2d0f0 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
2d100 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d  pPCache);.  a[3]
2d110 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2d120 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29 20 70  eValid ? (int) p
2d130 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20  Pager->dbSize : 
2d140 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  -1;.  a[4] = pPa
2d150 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
2d160 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
2d170 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
2d180 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
2d190 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
2d1a0 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
2d1b0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
2d1c0 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
2d1d0 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
2d1e0 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
2d1f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
2d200 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
2d210 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2d220 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2d230 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2d240 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  ry pager..*/.int
2d250 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
2d260 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67  emdb(Pager *pPag
2d270 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45  er){.  return ME
2d280 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  MDB;.}../*.** Ch
2d290 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 61  eck that there a
2d2a0 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76  re at least nSav
2d2b0 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74  epoint savepoint
2d2c0 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65 72 65  s open. If there
2d2d0 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
2d2e0 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53 61 76  y less than nSav
2d2f0 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74 68  epoints open, th
2d300 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20 6d  en open one or m
2d310 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 0a 2a  ore savepoints.*
2d320 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74 68 65  * to make up the
2d330 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49 66 20   difference. If 
2d340 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
2d350 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c 72 65  vepoints is alre
2d360 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20  ady.** equal to 
2d370 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e  nSavepoint, then
2d380 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2d390 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2d3a0 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
2d3b0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53  ocation fails, S
2d3c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
2d3d0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
2d3e0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2d3f0 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68  while opening th
2d400 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
2d410 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20 65  le, then an IO e
2d420 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20  rror code is.** 
2d430 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
2d440 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
2d450 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2d460 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
2d470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2d480 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b  int nSavepoint){
2d490 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d4a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d4c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2d4d0 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d 20   int nCurrent = 
2d4e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2d4f0 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  nt;        /* Cu
2d500 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
2d510 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20  savepoints */.. 
2d520 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e   if( nSavepoint>
2d530 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50 61 67  nCurrent && pPag
2d540 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2d550 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  {.    int ii;   
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d580 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2d590 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 53  le */.    PagerS
2d5a0 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b 20  avepoint *aNew; 
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5c0 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e 61    /* New Pager.a
2d5d0 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20  Savepoint array 
2d5e0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68 65  */..    /* Eithe
2d5f0 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 63  r there is no ac
2d600 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tive journal or 
2d610 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2d620 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20 20 20 20  is open or .    
2d630 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
2d640 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20  s always stored 
2d650 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20  in memory */.   
2d660 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d670 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c  >nSavepoint==0 |
2d680 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
2d690 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20 20 20 20  >sjfd) ||.      
2d6a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2d6b0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2d6c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2d6d0 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  ORY );..    /* G
2d6e0 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e 61 53  row the Pager.aS
2d6f0 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20 75  avepoint array u
2d700 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20  sing realloc(). 
2d710 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  Return SQLITE_NO
2d720 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  MEM.    ** if th
2d730 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  e allocation fai
2d740 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a  ls. Otherwise, z
2d750 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f 72 74  ero the new port
2d760 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20 0a 20  ion in case a . 
2d770 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69     ** malloc fai
2d780 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
2d790 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 20  e populating it 
2d7a0 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20  in the for(...) 
2d7b0 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20  loop below..    
2d7c0 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 50  */.    aNew = (P
2d7d0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 29  agerSavepoint *)
2d7e0 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a  sqlite3Realloc(.
2d7f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2d800 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65  aSavepoint, size
2d810 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  of(PagerSavepoin
2d820 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20  t)*nSavepoint.  
2d830 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e    );.    if( !aN
2d840 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ew ){.      retu
2d850 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d860 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
2d870 74 28 26 61 4e 65 77 5b 6e 43 75 72 72 65 6e 74  t(&aNew[nCurrent
2d880 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f 69 6e  ], 0, (nSavepoin
2d890 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20 73 69  t-nCurrent) * si
2d8a0 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f  zeof(PagerSavepo
2d8b0 69 6e 74 29 29 3b 0a 20 20 20 20 70 50 61 67 65  int));.    pPage
2d8c0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
2d8d0 61 4e 65 77 3b 0a 20 20 20 20 70 50 61 67 65 72  aNew;.    pPager
2d8e0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e  ->nSavepoint = n
2d8f0 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20 20 20  Savepoint;..    
2d900 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
2d910 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73  PagerSavepoint s
2d920 74 72 75 63 74 75 72 65 73 20 6a 75 73 74 20 61  tructures just a
2d930 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20  llocated. */.   
2d940 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74   for(ii=nCurrent
2d950 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b  ; ii<nSavepoint;
2d960 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
2d970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
2d980 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20  SizeValid );.   
2d990 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69     aNew[ii].nOri
2d9a0 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  g = pPager->dbSi
2d9b0 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ze;.      if( is
2d9c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2d9d0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
2d9e0 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20  rnalOff>0 ){.   
2d9f0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
2da00 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
2da10 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
2da20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2da30 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
2da40 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
2da50 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
2da60 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
2da70 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
2da80 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20  ger->nSubRec;.  
2da90 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e      aNew[ii].pIn
2daa0 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69  Savepoint = sqli
2dab0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
2dac0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
2dad0 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77  .      if( !aNew
2dae0 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2daf0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  t ){.        ret
2db00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2db10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2db20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
2db30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
2db40 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2db50 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  dy opened. */.  
2db60 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
2db70 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2db80 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2db90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2dba0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2dbb0 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  d to rollback or
2dbc0 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
2dbd0 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ) a savepoint..*
2dbe0 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * The savepoint 
2dbf0 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  to release or ro
2dc00 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20  llback need not 
2dc10 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  be the most rece
2dc20 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64  ntly .** created
2dc30 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
2dc40 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69  * Parameter op i
2dc50 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
2dc60 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2dc70 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  CK or SAVEPOINT_
2dc80 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69  RELEASE..** If i
2dc90 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
2dca0 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c  ELEASE, then rel
2dcb0 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79  ease and destroy
2dcc0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77   the savepoint w
2dcd0 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61  ith.** index iSa
2dce0 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69  vepoint. If it i
2dcf0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
2dd00 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62  BACK, then rollb
2dd10 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a  ack all changes.
2dd20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63 63  ** that have occ
2dd30 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20  urred since the 
2dd40 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f  specified savepo
2dd50 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e  int was created.
2dd60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70  .**.** The savep
2dd70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  oint to rollback
2dd80 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73 20 69   or release is i
2dd90 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
2dda0 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65  ameter .** iSave
2ddb0 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f  point. A value o
2ddc0 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65  f 0 means to ope
2ddd0 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  rate on the oute
2dde0 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a  rmost savepoint.
2ddf0 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20 63 72  ** (the first cr
2de00 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20  eated). A value 
2de10 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  of (Pager.nSavep
2de20 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70  oint-1) means op
2de30 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20  erate.** on the 
2de40 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
2de50 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  eated savepoint.
2de60 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69   If iSavepoint i
2de70 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a  s greater than.*
2de80 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  * (Pager.nSavepo
2de90 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69  int-1), then thi
2dea0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
2deb0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
2dec0 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
2ded0 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
2dee0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
2def0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
2df00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2df10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
2df20 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 74  s is different t
2df30 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  o calling .** sq
2df40 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
2df50 63 6b 28 29 20 62 65 63 61 75 73 65 20 74 68 69  ck() because thi
2df60 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2df70 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a  not terminate.**
2df80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2df90 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   or unlock the d
2dfa0 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74  atabase, it just
2dfb0 20 72 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a   restores the .*
2dfc0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
2dfd0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
2dfe0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
2dff0 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20  . .**.** In any 
2e000 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f  case, all savepo
2e010 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64  ints with an ind
2e020 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
2e030 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61  iSavepoint .** a
2e040 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66  re destroyed. If
2e050 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61   this is a relea
2e060 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70  se operation (op
2e070 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
2e080 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61  ASE),.** then sa
2e090 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69  vepoint iSavepoi
2e0a0 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72  nt is also destr
2e0b0 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oyed..**.** This
2e0c0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2e0d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2e0e0 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M if a memory al
2e0f0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
2e100 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  ** or an IO erro
2e110 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20  r code if an IO 
2e120 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2e130 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  le rolling back 
2e140 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  a .** savepoint.
2e150 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63   If no errors oc
2e160 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
2e170 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  s returned..*/ .
2e180 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2e190 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
2e1a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c  *pPager, int op,
2e1b0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
2e1c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2e1d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2e1e0 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
2e1f0 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
2e200 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2e210 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2e220 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
2e230 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
2e240 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66  OLLBACK );..  if
2e250 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61  ( iSavepoint<pPa
2e260 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2e270 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  ){.    int ii;  
2e280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2e290 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
2e2a0 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20  /.    int nNew; 
2e2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e2c0 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20  er of remaining 
2e2d0 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72  savepoints after
2e2e0 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20   this op. */..  
2e2f0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
2e300 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69  how many savepoi
2e310 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62  nts will still b
2e320 65 20 61 63 74 69 76 65 20 61 66 74 65 72 20 74  e active after t
2e330 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  his.    ** opera
2e340 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73  tion. Store this
2e350 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20   value in nNew. 
2e360 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72  Then free resour
2e370 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ces associated .
2e380 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
2e390 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20  savepoints that 
2e3a0 61 72 65 20 64 65 73 74 72 6f 79 65 64 20 62 79  are destroyed by
2e3b0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
2e3c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77  .    */.    nNew
2e3d0 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20   = iSavepoint + 
2e3e0 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
2e3f0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 66 6f  OLLBACK);.    fo
2e400 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50  r(ii=nNew; ii<pP
2e410 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2e420 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; ii++){.      s
2e430 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
2e440 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
2e450 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
2e460 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
2e470 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
2e480 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a  epoint = nNew;..
2e490 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2e4a0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
2e4b0 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b  ration, playback
2e4c0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73   the specified s
2e4d0 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a  avepoint..    **
2e4e0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74 65   If this is a te
2e4f0 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73 20 70  mp-file, it is p
2e500 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 65  ossible that the
2e510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2e520 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74  s.    ** not yet
2e530 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e   been opened. In
2e540 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2e550 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68   have been no ch
2e560 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  anges to.    ** 
2e570 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e580 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79 62 61  e, so the playba
2e590 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e  ck operation can
2e5a0 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   be skipped..   
2e5b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d   */.    if( op==
2e5c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2e5d0 43 4b 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  CK && isOpen(pPa
2e5e0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2e5f0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
2e600 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20  t *pSavepoint = 
2e610 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61  (nNew==0)?0:&pPa
2e620 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
2e630 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72  nNew-1];.      r
2e640 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63  c = pagerPlaybac
2e650 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65  kSavepoint(pPage
2e660 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r, pSavepoint);.
2e670 20 20 20 20 20 20 61 73 73 65 72 74 28 72 63 21        assert(rc!
2e680 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20  =SQLITE_DONE);. 
2e690 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
2e6a0 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65  f this is a rele
2e6b0 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ase of the outer
2e6c0 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c 20  most savepoint, 
2e6d0 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a  truncate .    **
2e6e0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2e6f0 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
2e700 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 69  n size. */.    i
2e710 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 6f 70  f( nNew==0 && op
2e720 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
2e730 41 53 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ASE && isOpen(pP
2e740 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2e750 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2e760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2e770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e780 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
2e790 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20  r->sjfd, 0);.   
2e7a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
2e7b0 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ec = 0;.    }.  
2e7c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e7d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2e7e0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
2e7f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2e800 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
2e810 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
2e820 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
2e830 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2e840 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
2e850 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
2e860 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73  Return the VFS s
2e870 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
2e880 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   pager..*/.const
2e890 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71   sqlite3_vfs *sq
2e8a0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61  lite3PagerVfs(Pa
2e8b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2e8c0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
2e8d0 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Vfs;.}../*.** Re
2e8e0 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61  turn the file ha
2e8f0 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74  ndle for the dat
2e900 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
2e910 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
2e920 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d  e pager.  This m
2e930 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ight return NULL
2e940 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   if the file has
2e950 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  .** not yet been
2e960 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69   opened..*/.sqli
2e970 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65  te3_file *sqlite
2e980 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72  3PagerFile(Pager
2e990 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2e9a0 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  urn pPager->fd;.
2e9b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e9c0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2e9d0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2e9e0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
2e9f0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
2ea00 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  erJournalname(Pa
2ea10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2ea20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
2ea30 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
2ea40 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2ea50 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
2ea60 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
2ea70 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
2ea80 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
2ea90 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
2eaa0 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
2eab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2eac0 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20  gerNosync(Pager 
2ead0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2eae0 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  rn pPager->noSyn
2eaf0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
2eb00 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
2eb10 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
2eb20 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
2eb30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2eb40 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20  PagerSetCodec(. 
2eb50 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
2eb60 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
2eb70 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
2eb80 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
2eb90 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20  *pCodecArg.){.  
2eba0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
2ebb0 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
2ebc0 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70  r->pCodecArg = p
2ebd0 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64  CodecArg;.}.#end
2ebe0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
2ebf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2ec00 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
2ec10 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
2ec20 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
2ec30 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
2ec40 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
2ec50 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2ec60 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
2ec70 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
2ec80 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
2ec90 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
2eca0 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
2ecb0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
2ecc0 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
2ecd0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
2ece0 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  ly located at pg
2ecf0 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
2ed00 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
2ed10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
2ed20 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
2ed30 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
2ed40 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
2ed50 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2ed60 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
2ed70 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
2ed80 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
2ed90 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2eda0 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
2edb0 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
2edc0 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
2edd0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
2ede0 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
2edf0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
2ee00 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
2ee10 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
2ee20 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
2ee30 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
2ee40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
2ee50 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
2ee60 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
2ee70 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
2ee80 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
2ee90 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
2eea0 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
2eeb0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
2eec0 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
2eed0 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
2eee0 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
2eef0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
2ef00 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
2ef10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72  *.** If the four
2ef20 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43  th argument, isC
2ef30 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65  ommit, is non-ze
2ef40 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ro, then this pa
2ef50 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d  ge is being.** m
2ef60 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  oved as part of 
2ef70 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67  a database reorg
2ef80 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62  anization just b
2ef90 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
2efa0 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69  ction .** is bei
2efb0 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e  ng committed. In
2efc0 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69   this case, it i
2efd0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
2efe0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  t the database p
2eff0 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65  age .** pPg refe
2f000 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62  rs to will not b
2f010 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61  e written to aga
2f020 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
2f030 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
2f040 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2f050 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2f060 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
2f070 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2f080 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
2f090 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  s. Otherwise, it
2f0a0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2f0b0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
2f0c0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
2f0d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
2f0e0 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
2f0f0 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d   pgno, int isCom
2f100 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  mit){.  PgHdr *p
2f110 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  PgOld;          
2f120 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2f130 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
2f140 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  en. */.  Pgno ne
2f150 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20  edSyncPgno = 0; 
2f160 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c        /* Old val
2f170 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c  ue of pPg->pgno,
2f180 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75   if sync is requ
2f190 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ired */.  int rc
2f1a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f1b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2f1c0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
2f1d0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
2f1e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2f1f0 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64  page being moved
2f200 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61   is dirty and ha
2f210 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64  s not been saved
2f220 20 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20   by the latest. 
2f230 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74   ** savepoint, t
2f240 68 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72  hen save the cur
2f250 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
2f260 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
2f270 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75  he .  ** sub-jou
2f280 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69  rnal now. This i
2f290 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  s required to ha
2f2a0 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ndle the followi
2f2b0 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a  ng scenario:.  *
2f2c0 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a  *.  **   BEGIN;.
2f2d0 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
2f2e0 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d  l page X, then m
2f2f0 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f  odify it in memo
2f300 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56  ry>.  **     SAV
2f310 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a  EPOINT one;.  **
2f320 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67         <Move pag
2f330 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  e X to location 
2f340 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  Y>.  **     ROLL
2f350 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a  BACK TO one;.  *
2f360 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58  *.  ** If page X
2f370 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65   were not writte
2f380 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
2f390 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f  rnal here, it wo
2f3a0 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20  uld not.  ** be 
2f3b0 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74  possible to rest
2f3c0 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ore its contents
2f3d0 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
2f3e0 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a  ACK TO one".  **
2f3f0 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20   statement were 
2f400 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  is processed..  
2f410 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e  **.  ** subjourn
2f420 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65  alPage() may nee
2f430 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
2f440 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67  ace to store pPg
2f450 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a  ->pgno into.  **
2f460 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
2f470 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20  epoint bitvecs. 
2f480 54 68 69 73 20 69 73 20 74 68 65 20 72 65 61 73  This is the reas
2f490 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  on this function
2f4a0 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e  .  ** may return
2f4b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20   SQLITE_NOMEM.. 
2f4c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66   */.  if( pPg->f
2f4d0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2f4e0 20 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71 75   .   && subjRequ
2f4f0 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
2f500 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
2f510 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2f520 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20  age(pPg)).  ){. 
2f530 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f540 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
2f550 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
2f560 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
2f570 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
2f580 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
2f590 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2f5a0 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  o, (pPg->flags&P
2f5b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
2f5c0 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49  1:0, pgno));.  I
2f5d0 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
2f5e0 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
2f5f0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
2f600 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68  no))..  /* If th
2f610 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
2f620 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
2f630 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e  efore page pPg->
2f640 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65  pgno can.  ** be
2f650 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f   written to, sto
2f660 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  re pPg->pgno in 
2f670 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  local variable n
2f680 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a  eedSyncPgno..  *
2f690 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73  *.  ** If the is
2f6a0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  Commit flag is s
2f6b0 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  et, there is no 
2f6c0 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2f6d0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a   that.  ** the j
2f6e0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
2f6f0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
2f700 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
2f710 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a   pPg->pgno .  **
2f720 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2f730 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
2f740 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
2f750 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
2f760 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
2f770 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
2f780 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20  GHDR_NEED_SYNC) 
2f790 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  && !isCommit ){.
2f7a0 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
2f7b0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
2f7c0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
2f7d0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
2f7e0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
2f7f0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
2f800 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
2f810 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2f820 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TY );.    assert
2f830 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
2f840 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
2f850 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
2f860 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
2f870 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
2f880 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
2f890 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
2f8a0 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
2f8b0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
2f8c0 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
2f8d0 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
2f8e0 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
2f8f0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
2f900 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
2f910 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
2f920 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
2f930 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
2f940 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
2f950 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50  _NEED_SYNC;.  pP
2f960 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
2f970 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
2f980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
2f990 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e  gOld || pPgOld->
2f9a0 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nRef==1 );.  if(
2f9b0 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70   pPgOld ){.    p
2f9c0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50  Pg->flags |= (pP
2f9d0 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44  gOld->flags&PGHD
2f9e0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20  R_NEED_SYNC);.  
2f9f0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  }..  sqlite3Pcac
2fa00 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f  heMove(pPg, pgno
2fa10 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
2fa20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2fa30 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29  acheDrop(pPgOld)
2fa40 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2fa50 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
2fa60 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
2fa70 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
2fa80 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
2fa90 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
2faa0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
2fab0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2fac0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fad0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
2fae0 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
2faf0 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
2fb00 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
2fb10 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
2fb20 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
2fb30 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
2fb40 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
2fb50 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
2fb60 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
2fb70 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
2fb80 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
2fb90 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
2fba0 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
2fbb0 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
2fbc0 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
2fbd0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
2fbe0 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
2fbf0 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
2fc00 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
2fc10 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
2fc20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
2fc30 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
2fc40 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
2fc50 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
2fc60 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
2fc70 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
2fc80 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
2fc90 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
2fca0 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
2fcb0 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
2fcc0 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
2fcd0 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
2fce0 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
2fcf0 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
2fd00 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
2fd10 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2fd20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
2fd30 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
2fd40 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
2fd50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2fd60 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
2fd70 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
2fd80 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
2fd90 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
2fda0 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
2fdb0 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
2fdc0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
2fdd0 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
2fde0 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
2fdf0 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
2fe00 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
2fe10 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
2fe20 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
2fe30 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
2fe40 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
2fe50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2fe60 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
2fe70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2fe80 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2fe90 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
2fea0 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
2feb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fec0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
2fed0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->pInJournal &&
2fee0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70   needSyncPgno<=p
2fef0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2ff00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2ff10 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28  ite3BitvecClear(
2ff20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2ff30 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  al, needSyncPgno
2ff40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ff50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ff60 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
2ff70 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2ff80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ff90 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45  noSync==0 && !ME
2ffa0 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64  MDB );.    pPgHd
2ffb0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
2ffc0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
2ffd0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2ffe0 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
2fff0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
30000 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
30010 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
30020 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
30030 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
30040 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
30050 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
30060 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
30070 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
30080 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
30090 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  e *pPg){.  asser
300a0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c  t( pPg->nRef>0 |
300b0 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d  | pPg->pPager->m
300c0 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e  emDb );.  return
300d0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a   pPg->pData;.}..
300e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
300f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
30100 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
30110 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
30120 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
30130 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
30140 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
30150 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
30160 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
30170 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
30180 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
30190 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  ->pPager;.  retu
301a0 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e  rn (pPager?pPg->
301b0 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a  pExtra:0);.}../*
301c0 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
301d0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72  locking-mode for
301e0 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
301f0 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
30200 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
30210 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30220 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f  _QUERY, PAGER_LO
30230 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
30240 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f   or .** PAGER_LO
30250 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
30260 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61  IVE. If the para
30270 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
30280 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
30290 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73   locking-mode is
302a0 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
302b0 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
302c0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
302d0 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
302e0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
302f0 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50  E_NORMAL or.** P
30300 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30310 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69  _EXCLUSIVE, indi
30320 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
30330 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
30340 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  ated).** locking
30350 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
30360 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
30370 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  gMode(Pager *pPa
30380 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
30390 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
303a0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
303b0 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
303c0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
303d0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
303e0 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
303f0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
30400 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30410 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
30420 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
30430 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c  CKINGMODE_QUERY<
30440 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
30450 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30460 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41  _NORMAL>=0 && PA
30470 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
30480 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a  EXCLUSIVE>=0 );.
30490 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26    if( eMode>=0 &
304a0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
304b0 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
304c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
304d0 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20   = (u8)eMode;.  
304e0 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
304f0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
30500 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eMode;.}../*.** 
30510 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72  Get/set the jour
30520 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  nal-mode for thi
30530 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
30540 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
30550 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
30560 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
30570 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20  ODE_QUERY.**    
30580 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30590 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50  E_DELETE.**    P
305a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
305b0 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  _TRUNCATE.**    
305c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
305d0 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  E_PERSIST.**    
305e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
305f0 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45  E_OFF.**    PAGE
30600 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
30610 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  MORY.**.** If th
30620 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
30630 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20  ot _QUERY, then 
30640 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
30650 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
30660 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  * value specifie
30670 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
30680 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
30690 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
306a0 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f  ibly updated) jo
306b0 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
306c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
306d0 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
306e0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
306f0 6f 64 65 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d  ode){.  if( !MEM
30700 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
30710 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
30720 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
30730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
30740 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
30750 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
30760 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
30770 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
30780 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
30790 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  CATE.           
307a0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
307b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
307c0 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20  ERSIST.         
307d0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
307e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
307f0 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
30800 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
30810 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
30820 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 61 73  MEMORY );.    as
30830 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
30840 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
30850 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  );.    if( eMode
30860 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  >=0 ){.      pPa
30870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
30880 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20   = (u8)eMode;.  
30890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
308a0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
308b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
308c0 51 55 45 52 59 20 29 3b 0a 20 20 20 20 7d 0a 20  QUERY );.    }. 
308d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
308e0 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  )pPager->journal
308f0 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
30900 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d  et/set the size-
30910 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70  limit used for p
30920 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
30930 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20  l files..*/.i64 
30940 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
30950 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67  nalSizeLimit(Pag
30960 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20  er *pPager, i64 
30970 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69  iLimit){.  if( i
30980 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20  Limit>=-1 ){.   
30990 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
309a0 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  SizeLimit = iLim
309b0 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
309c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
309d0 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a  SizeLimit;.}../*
309e0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
309f0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67  nter to the pPag
30a00 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69  er->pBackup vari
30a10 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70  able. The backup
30a20 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61   module.** in ba
30a30 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73  ckup.c maintains
30a40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
30a50 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54  this variable. T
30a60 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73  his module.** us
30a70 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61  es it opaquely a
30a80 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
30a90 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
30aa0 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73  start() and.** s
30ab0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
30ac0 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71  te() only..*/.sq
30ad0 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73  lite3_backup **s
30ae0 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75  qlite3PagerBacku
30af0 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67  pPtr(Pager *pPag
30b00 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70  er){.  return &p
30b10 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a  Pager->pBackup;.
30b20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
30b30 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
30b40 2a 2f 0a                                         */.