/ Hex Artifact Content
Login

Artifact 3a36360acb9caa54d4fdd6439454348eab3b4b5a:


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 36  : pager.c,v 1.56
0350: 30 20 32 30 30 39 2f 30 31 2f 33 30 20 30 35 3a  0 2009/01/30 05:
0360: 34 30 3a 32 37 20 73 68 61 6e 65 20 45 78 70 20  40:27 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 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
39b0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
39c0: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
39d0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
39e0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
39f0: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
3a00: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
3a10: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
3a20: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
3a30: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
3a40: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
3a50: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
3a60: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3a70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
3a80: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
3a90: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
3aa0: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
3ab0: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
3ac0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
3ad0: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
3ae0: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
3af0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
3b00: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to 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 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
3b30: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
3b40: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
3b50: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
3b60: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
3b70: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
3b80: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
3b90: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
3ba0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
3bb0: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
3bc0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
3bd0: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
3be0: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
3bf0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
3c00: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
3c10: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
3c20: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
3c30: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
3c40: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
3c50: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
3c60: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
3c70: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
3c80: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
3c90: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
3ca0: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
3cb0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
3cc0: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
3cd0: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
3ce0: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
3cf0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
3d00: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
3d10: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
3d20: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
3d30: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
3d40: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
3d50: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
3d60: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
3d70: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
3d80: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
3d90: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
3da0: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
3db0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
3dc0: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
3dd0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
3de0: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
3df0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
3e00: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3e10: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
3e20: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
3e30: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
3e40: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
3e50: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
3e60: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
3e70: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
3e80: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
3e90: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
3ea0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
3eb0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
3ec0: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
3ed0: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
3ee0: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
3ef0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
3f00: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
3f10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
3f20: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
3f30: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
3f40: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
3f50: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
3f60: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
3f70: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
3f80: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
3f90: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
3fa0: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
3fb0: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
3fc0: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
3fd0: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
3fe0: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
3ff0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
4000: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
4010: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
4020: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
4030: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
4040: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
4050: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
4060: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
4070: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
4080: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
4090: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
40a0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
40b0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
40c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
40d0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
40e0: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
40f0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
4100: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
4110: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
4120: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
4130: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
4140: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
4150: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
4160: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
4170: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
4180: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
4190: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
41a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
41b0: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
41c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
41d0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
41e0: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
41f0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
4200: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
4210: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
4220: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
4230: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
4240: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
4250: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
4260: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
4270: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
4280: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
4290: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
42a0: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
42b0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
42c0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
42d0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
42e0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
42f0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
4300: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
4310: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
4320: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
4330: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
4340: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
4350: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
4360: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
4370: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
4380: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
4390: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
43a0: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
43b0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
43c0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
43d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
43e0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
43f0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
4400: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
4410: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
4420: 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65  47483647..#ifnde
4430: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
4440: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
4450: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
4460: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
4470: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
4480: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
4490: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
44a0: 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65  ger){..  /* A te
44b0: 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79  mp-file is alway
44c0: 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55  s in PAGER_EXCLU
44d0: 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59  SIVE or PAGER_SY
44e0: 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  NCED state. */. 
44f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
4500: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
4510: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
4520: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
4530: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  ;..  /* The chan
4540: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
4550: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66   is always set f
4560: 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f  or temp-files */
4570: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4580: 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
4590: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
45a0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
45b0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
45c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
45d0: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
45e0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
45f0: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
4600: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
4610: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
4620: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
4630: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
4640: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
4650: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
4660: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
4670: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
4680: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
4690: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
46a0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
46b0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
46c0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
46d0: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
46e0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
46f0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
4700: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
4710: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4720: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
4730: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
4740: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
4750: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f  dr *pPg){.  Pgno
4760: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
4770: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
4780: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
4790: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
47a0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e  (i=0; i<pPager->
47b0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29  nSavepoint; i++)
47c0: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
47d0: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
47e0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d  r->aSavepoint[i]
47f0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72  ;.    if( p->nOr
4800: 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73  ig>=pgno && 0==s
4810: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4820: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
4830: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
4840: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
4850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4870: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
4880: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
4890: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
48a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48b0: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
48c0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
48d0: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
48e0: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
48f0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
4900: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
4910: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
4920: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
4930: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
4940: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
4950: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
4960: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
4970: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
4980: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
4990: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
49a0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
49b0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
49c0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
49d0: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
49e0: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
49f0: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
4a00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
4a10: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
4a20: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
4a30: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
4a40: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4a50: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
4a60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
4a70: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
4a80: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
4a90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4aa0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
4ab0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
4ac0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
4ad0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4ae0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4af0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
4b00: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
4b10: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
4b20: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
4b30: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
4b40: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
4b50: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
4b60: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
4b70: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
4b80: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
4b90: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
4ba0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
4bb0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
4bc0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4bd0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4be0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
4bf0: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
4c00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
4c10: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
4c20: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
4c30: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
4c40: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
4c50: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
4c60: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
4c70: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  set);.}../*.** T
4c80: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
4c90: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
4ca0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
4cb0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
4cc0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
4cd0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
4ce0: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
4cf0: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
4d00: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
4d10: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
4d20: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
4d30: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
4d40: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
4d50: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
4d60: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
4d70: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
4d80: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
4d90: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
4da0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
4db0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
4dc0: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  ods)../*.** If f
4dd0: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
4de0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
4df0: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
4e00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
4e10: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
4e20: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
4e30: 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70  ck){.  if( !isOp
4e40: 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72  en(pFd) ){.    r
4e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4e60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
4e70: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
4e80: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
4e90: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4ea0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
4eb0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
4ec0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
4ed0: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
4ee0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
4ef0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
4f00: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
4f10: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
4f20: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
4f30: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
4f40: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
4f50: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
4f60: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
4f70: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
4f80: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
4f90: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
4fa0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
4fb0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
4fc0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
4fd0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
4fe0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
4ff0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
5000: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
5010: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
5020: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
5030: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
5040: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
5050: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
5060: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
5070: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
5080: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
5090: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
50a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
50b0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
50c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
50d0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
50e0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
50f0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
5100: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
5110: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
5120: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
5130: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
5140: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
5150: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
5160: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
5170: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
5180: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
5190: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
51a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
51b0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
51c0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
51d0: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
5200: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
5210: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
5220: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
5230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
5240: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
5250: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5270: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
5280: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
5290: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
52a0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
52b0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
52c0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
52d0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
52e0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
52f0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
5300: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
5310: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
5320: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
5330: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
5340: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
5350: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
5360: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
5370: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
5380: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
5390: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
53a0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
53b0: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
53c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
53d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
53e0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
53f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
5400: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
5410: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
5420: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
5430: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
5440: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
5450: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
5460: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
5470: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
5480: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
5490: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
54a0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
54b0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
54c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
54d0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
54e0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
54f0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
5500: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
5510: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
5520: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
5530: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
5540: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
5550: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
5560: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
5570: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
5580: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
5590: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
55a0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
55b0: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
55c0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
55d0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
55e0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
55f0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
5600: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
5610: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
5620: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
5630: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
5640: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
5650: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
5660: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
5670: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
5680: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
5690: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
56a0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
56b0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
56c0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
56d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
56e0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
56f0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
5700: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
5710: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
5720: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
5730: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
5740: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
5750: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
5760: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
5770: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
5780: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5790: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
57a0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
57b0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
57c0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
57d0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
57e0: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
57f0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
5800: 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  er->errCode.    
5810: 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
5820: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
5830: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
5840: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
5850: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
5860: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
5870: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
5880: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
5890: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
58a0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
58b0: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
58c0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
58d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
58e0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
58f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
5900: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
5910: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
5920: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
5930: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
5940: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
5950: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
5960: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
5970: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
5980: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
5990: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
59a0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
59b0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
59c0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
59d0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
59e0: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
59f0: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
5a00: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
5a10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5a20: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
5a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
5a40: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
5a50: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
5a60: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
5a70: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
5a80: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
5a90: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
5aa0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
5ab0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
5ac0: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
5ad0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
5ae0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
5af0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5b00: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
5b10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
5b20: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
5b30: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
5b40: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
5b50: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
5b60: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
5b70: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
5b80: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
5b90: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
5ba0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
5bb0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
5bc0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
5bd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5be0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
5bf0: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
5c00: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
5c10: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
5c20: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
5c30: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
5c40: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
5c50: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
5c60: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
5c70: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
5c80: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
5c90: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
5ca0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
5cb0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
5cc0: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
5cd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5ce0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
5cf0: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
5d00: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
5d10: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
5d20: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
5d30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
5d40: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
5d50: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
5d60: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
5d70: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
5d80: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
5d90: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
5da0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
5db0: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
5dc0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
5dd0: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
5de0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
5df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
5e00: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
5e10: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
5e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
5e30: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
5e40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5e50: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e70: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
5e80: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
5e90: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
5ea0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
5ed0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
5ee0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
5ef0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
5f00: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
5f10: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
5f20: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5f30: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
5f40: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
5f50: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
5f60: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
5f70: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
5f80: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
5f90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
5fa0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
5fb0: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
5fc0: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
5fd0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
5fe0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
5ff0: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
6000: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
6010: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
6020: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6030: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
6040: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
6050: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
6060: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
6070: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
6080: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
6090: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
60a0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
60b0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
60c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
60d0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
60e0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
60f0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
6100: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
6110: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
6120: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
6130: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6140: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
6150: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
6160: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
6170: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
6180: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
6190: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
61a0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
61b0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
61c0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
61d0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
61e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
61f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6200: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
6210: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
6220: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
6230: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
6240: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
6250: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
6260: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
6270: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6280: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
6290: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
62a0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
62b0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
62c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
62d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
62e0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
62f0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
6300: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
6310: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
6320: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
6330: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6340: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
6350: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
6360: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
6370: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
6380: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
6390: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
63a0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
63b0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
63c0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
63d0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
63e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
6400: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
6410: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
6420: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
6430: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
6440: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
6460: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
6490: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
64a0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
64b0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
64c0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
64d0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
64e0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
64f0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
6500: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
6510: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
6520: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
6530: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6540: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6550: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
6560: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
6570: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
6580: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
6590: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
65a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
65b0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
65c0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
65d0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
65e0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
65f0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
6600: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
6610: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6620: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
6630: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6640: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
6650: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
6660: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
6670: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
6680: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
6690: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
66a0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
66b0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
66c0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
66d0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
66e0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
66f0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
6700: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
6710: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
6720: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
6730: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
6740: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
6750: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
6760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
6770: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
6780: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
6790: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
67a0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
67b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
67c0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
67d0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
67e0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
67f0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
6800: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
6810: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
6820: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
6830: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
6840: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
6850: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
6860: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
6870: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
6880: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
6890: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
68a0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
68b0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
68c0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
68d0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
68e0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
68f0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
6900: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
6910: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
6920: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
6930: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
6940: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
6950: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
6960: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
6970: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
6980: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
6990: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
69a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
69b0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
69c0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
69d0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
69e0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
69f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a20: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
6a30: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
6a40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
6a50: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6a60: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
6a70: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
6a80: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
6a90: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
6aa0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
6ab0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
6ac0: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
6ad0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
6ae0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
6af0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
6b00: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
6b10: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
6b20: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
6b30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6b40: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
6b50: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
6b60: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
6b70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6b80: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6b90: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
6ba0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
6bb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
6bc0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
6bd0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
6be0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6bf0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
6c00: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
6c10: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
6c20: 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
6c30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
6c40: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
6c50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
6c60: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
6c70: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
6c80: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
6c90: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
6ca0: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
6cb0: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
6cc0: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
6cd0: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
6ce0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
6cf0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
6d00: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
6d10: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
6d20: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
6d30: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
6d40: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
6d50: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
6d60: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
6d70: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
6d80: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
6d90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
6da0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
6db0: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
6dc0: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
6dd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
6de0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
6df0: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
6e00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6e10: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
6e20: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
6e30: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
6e40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
6e50: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
6e60: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6e70: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
6e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6e90: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
6ea0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6eb0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
6ec0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
6ed0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
6ee0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
6ef0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
6f00: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
6f10: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6f20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
6f30: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
6f40: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
6f50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
6f60: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
6f70: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
6f80: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
6f90: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
6fa0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
6fb0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
6fc0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
6fd0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
6fe0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
6ff0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
7000: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
7010: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
7020: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
7030: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
7040: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
7050: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
7060: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
7070: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
7080: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
7090: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
70a0: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
70b0: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
70c0: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
70d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
70e0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
70f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7100: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7110: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
7120: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7130: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
7140: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
7150: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f  r->pTmpSpace;  /
7160: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
7170: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
7180: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
7190: 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  nHeader = pPager
71a0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  ->pageSize;     
71b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
71c0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
71d0: 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32  zHeader */.  u32
71e0: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61   /* Bytes of hea
7210: 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74  der sector writt
7220: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  en */.  int ii; 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7250: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
7260: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
7270: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
7280: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
7290: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
72a0: 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48  en. */..  if( nH
72b0: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
72c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
72d0: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
72e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
72f0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
7300: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
7310: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
7320: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77  nd any of them w
7330: 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a  ere created .  *
7340: 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  * since the most
7350: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
7360: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
7370: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a  en, update the .
7380: 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
7390: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
73a0: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
73b0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
73c0: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
73d0: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
73e0: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
73f0: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
7400: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
7410: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
7420: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
7430: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
7440: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
7450: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
7460: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
7470: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
7480: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
7490: 70 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70  pPager);.  memcp
74a0: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
74b0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
74c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
74d0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
74e0: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
74f0: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
7500: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
7510: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
7520: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
7530: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
7540: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
7550: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
7560: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
7570: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
7580: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
7590: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
75a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
75b0: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
75c0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
75d0: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
75e0: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
75f0: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
7600: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
7610: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
7620: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
7630: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
7640: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
7650: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
7660: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
7670: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
7680: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
7690: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
76a0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
76b0: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
76c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
76d0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
76e0: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
76f0: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
7700: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
7710: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
7720: 75 72 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ure occured whil
7730: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
7740: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
7750: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
7760: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
7770: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
7780: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
7790: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
77a0: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
77b0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
77c0: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
77d0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
77e0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
77f0: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
7800: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
7810: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
7820: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
7830: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
7840: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
7850: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
7860: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
7870: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
7880: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
7890: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
78a0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
78b0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
78c0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
78d0: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
78e0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
78f0: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
7900: 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d  ync) || (pPager-
7910: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7920: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7930: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
7940: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7950: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
7960: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
7970: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
7980: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75  ND) .  ){.    pu
7990: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
79a0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
79b0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
79c0: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
79d0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
79e0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
79f0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29  urnalMagic)], 0)
7a00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
7a10: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
7a20: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
7a30: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
7a40: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
7a50: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
7a60: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
7a70: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
7a80: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7a90: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7aa0: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
7ab0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
7ac0: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
7ad0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
7ae0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
7af0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
7b00: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
7b10: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
7b20: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
7b30: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
7b40: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
7b50: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
7b60: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7b70: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
7b80: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
7b90: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ize);..  /* The 
7ba0: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  page size */.  p
7bb0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7bc0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7bd0: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
7be0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
7bf0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
7c00: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
7c10: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
7c20: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
7c30: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
7c40: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
7c50: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
7c60: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
7c70: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
7c80: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
7c90: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
7ca0: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
7cb0: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
7cc0: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
7cd0: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
7ce0: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
7cf0: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
7d00: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d10: 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20  gic)+20], 0,.   
7d20: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
7d30: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d40: 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a  gic)+20));..  /*
7d50: 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69   In theory, it i
7d60: 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79  s only necessary
7d70: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38   to write the 28
7d80: 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20   bytes that the 
7d90: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
7da0: 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f  ader consumes to
7db0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7dc0: 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63  e here. Then inc
7dd0: 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a  rement the .  **
7de0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
7df0: 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f  f variable by JO
7e00: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20  URNAL_HDR_SZ so 
7e10: 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20  that the next . 
7e20: 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72   ** record is wr
7e30: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c  itten to the fol
7e40: 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c  lowing sector (l
7e50: 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20  eaving a gap in 
7e60: 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68  the file.  ** th
7e70: 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69  at will be impli
7e80: 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20  citly filled in 
7e90: 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a  by the OS)..  **
7ea0: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74  .  ** However it
7eb0: 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76   has been discov
7ec0: 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d  ered that on som
7ed0: 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70  e systems this p
7ee0: 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a  attern can .  **
7ef0: 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c   be significantl
7f00: 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f  y slower than co
7f10: 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69  ntiguously writi
7f20: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ng data to the f
7f30: 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69  ile,.  ** even i
7f40: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70  f that means exp
7f50: 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20  licitly writing 
7f60: 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63  data to the bloc
7f70: 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52  k of .  ** (JOUR
7f80: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
7f90: 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c   bytes that will
7fa0: 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f   not be used. So
7fb0: 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20   that is what.  
7fc0: 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a  ** is done. .  *
7fd0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  *.  ** The loop 
7fe0: 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65  is required here
7ff0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63   in case the sec
8000: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
8010: 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
8020: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
8030: 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20  size. Since the 
8040: 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69  zHeader buffer i
8050: 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67  s only Pager.pag
8060: 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73  eSize.  ** bytes
8070: 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74   in size, more t
8080: 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  han one call to 
8090: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
80a0: 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64   may be required
80b0: 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  .  ** to populat
80c0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
80d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
80e0: 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  or..  */ .  for(
80f0: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
8100: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
8110: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8120: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
8130: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
8140: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
8150: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
8160: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
8170: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
8180: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
8190: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
81a0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
81b0: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
81c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
81d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
81e0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
81f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
8200: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
8210: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
8220: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
8230: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
8240: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8250: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
8260: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
8270: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
8280: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
8290: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
82a0: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
82b0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
82c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
82d0: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
82e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
82f0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
8300: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
8310: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
8320: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
8330: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
8340: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
8350: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
8360: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
8370: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
8380: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
8390: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
83a0: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
83b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
83c0: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
83d0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
83e0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
83f0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
8400: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
8410: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
8420: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
8430: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
8440: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
8450: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
8460: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
8470: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
8480: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
8490: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
84a0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
84b0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
84c0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
84d0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
84e0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
84f0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
8500: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
8510: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
8520: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
8530: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
8540: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8550: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
8560: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
8570: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
8580: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
8590: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
85a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
85b0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  r object */.  i6
85c0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20  4 journalSize,  
85d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
85e0: 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  ze of the open j
85f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
8600: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ytes */.  u32 *p
8610: 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20  NRec,           
8620: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
8630: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
8640: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f  he nRec field */
8650: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20  .  u32 *pDbSize 
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66  /* OUT: Value of
8680: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
8690: 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f  se size field */
86a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
86d0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
86e0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
86f0: 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20      /* A buffer 
8700: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
8710: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
8720: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
8730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8740: 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  fset of journal 
8750: 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61  header being rea
8760: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
8770: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
8780: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
8790: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
87a0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
87b0: 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72  /* Advance Pager
87c0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74  .journalOff to t
87d0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
87e0: 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20  next sector. If 
87f0: 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
8800: 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61   file is too sma
8810: 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  ll for there to 
8820: 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72  be a header stor
8830: 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ed at this.  ** 
8840: 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51  point, return SQ
8850: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a  LITE_DONE..  */.
8860: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8870: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
8880: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
8890: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
88a0: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
88b0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
88c0: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
88d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
88e0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
88f0: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
8900: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
8910: 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
8920: 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66  first 8 bytes of
8930: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
8940: 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20  der. If they do 
8950: 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74  not match.  ** t
8960: 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67  he  magic string
8970: 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74   found at the st
8980: 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72  art of each jour
8990: 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75  nal header, retu
89a0: 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  rn.  ** SQLITE_D
89b0: 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ONE. If an IO er
89c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
89d0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
89e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a  . Otherwise,.  *
89f0: 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  * proceed..  */.
8a00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8a10: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
8a20: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
8a30: 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66  (aMagic), iHdrOf
8a40: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  f);.  if( rc ){.
8a50: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8a60: 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
8a70: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
8a80: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
8a90: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
8aa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8ab0: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ONE;.  }..  /* R
8ac0: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68  ead the first th
8ad0: 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64  ree 32-bit field
8ae0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
8af0: 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65   header: The nRe
8b00: 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68  c.  ** field, th
8b10: 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69  e checksum-initi
8b20: 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64  alizer and the d
8b30: 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20  atabase size at 
8b40: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
8b50: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
8b60: 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  n. Return an err
8b70: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
8b80: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
8b90: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
8ba0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8bb0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8bc0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70  fd, iHdrOff+8, p
8bd0: 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c  NRec)).   || SQL
8be0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8bf0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8c00: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32  >jfd, iHdrOff+12
8c10: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
8c20: 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Init)).   || SQL
8c30: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8c40: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8c50: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36  >jfd, iHdrOff+16
8c60: 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b  , pDbSize)).  ){
8c70: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8c80: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
8c90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
8ca0: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67   ){.    u32 iPag
8cb0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
8cc0: 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a       /* Page-siz
8cd0: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
8ce0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
8cf0: 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65   u32 iSectorSize
8d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8d10: 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   Sector-size fie
8d20: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
8d30: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  ader */.    u16 
8d40: 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20  iPageSize16;    
8d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
8d60: 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e   of iPageSize in
8d70: 20 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65   16-bit variable
8d80: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
8d90: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
8da0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
8db0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
8dc0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
8dd0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8de0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8df0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8e00: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
8e10: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
8e20: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8e30: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8e40: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
8e50: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
8e60: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
8e70: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
8e80: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
8e90: 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20  the values read 
8ea0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69  from the page-si
8eb0: 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
8ec0: 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a  ze fields.    **
8ed0: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
8ee0: 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e  e. To be 'in ran
8ef0: 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73  ge', both values
8f00: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f   need to be a po
8f10: 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77  wer.    ** of tw
8f20: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
8f30: 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20  r equal to 512, 
8f40: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
8f50: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
8f60: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
8f70: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
8f80: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
8f90: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
8fa0: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
8fb0: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
8fc0: 74 6f 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20  torSize<512.    
8fd0: 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51   || iPageSize>SQ
8fe0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8ff0: 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a  ZE || iSectorSiz
9000: 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
9010: 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67  E.     || ((iPag
9020: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
9030: 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53  ze)!=0   || ((iS
9040: 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65  ectorSize-1)&iSe
9050: 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20  ctorSize)!=0 .  
9060: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66    ){.      /* If
9070: 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20   the either the 
9080: 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63  page-size or sec
9090: 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  tor-size in the 
90a0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
90b0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61  s .      ** inva
90c0: 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72  lid, then the pr
90d0: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
90e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
90f0: 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20  der must have . 
9100: 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20       ** crashed 
9110: 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65  before the heade
9120: 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e  r was synced. In
9130: 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20   this case stop 
9140: 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  reading .      *
9150: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
9160: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  le here..      *
9170: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
9180: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
9190: 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
91a0: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74   the page-size t
91b0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
91c0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
91d0: 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a  journal. .    **
91e0: 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28   Use a testcase(
91f0: 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20  ) macro to make 
9200: 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  sure that malloc
9210: 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20   failure within 
9220: 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74  .    ** PagerSet
9230: 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65  Pagesize() is te
9240: 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sted..    */.   
9250: 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28   iPageSize16 = (
9260: 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20  u16)iPageSize;. 
9270: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
9280: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
9290: 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
92a0: 7a 65 31 36 29 3b 0a 20 20 20 20 74 65 73 74 63  ze16);.    testc
92b0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
92c0: 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OK );.    assert
92d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
92e0: 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d  || iPageSize16==
92f0: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29  (u16)iPageSize )
9300: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
9310: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
9320: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
9330: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
9340: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
9350: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
9360: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
9370: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
9380: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
9390: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
93a0: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
93b0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
93c0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
93d0: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
93e0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
93f0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
9400: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
9410: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
9420: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
9430: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
9440: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
9450: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
9460: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
9470: 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
9480: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
9490: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
94a0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
94b0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
94c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
94d0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
94e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
94f0: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
9500: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
9510: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
9520: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
9530: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
9540: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
9550: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
9560: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
9570: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
9580: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
9590: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
95a0: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
95b0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
95c0: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
95d0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
95e0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
95f0: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
9600: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
9610: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
9620: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
9630: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
9640: 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
9650: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
9660: 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
9670: 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
9680: 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
9690: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
96a0: 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
96b0: 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
96c0: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
96d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
96e0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
96f0: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
9700: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
9710: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
9720: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
9730: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
9740: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
9750: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
9760: 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
9770: 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
9780: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
9790: 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
97a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
97b0: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
97c0: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
97d0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
97e0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
97f0: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
9800: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
9810: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
9820: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
9830: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
9840: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
9850: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9870: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9880: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
9890: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
98b0: 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
98c0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
98d0: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98f0: 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
9900: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
9910: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
9920: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
9930: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9940: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
9950: 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
9960: 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9980: 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
9990: 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
99a0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
99b0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
99c0: 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  er.   || pPager-
99d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
99e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
99f0: 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
9a00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
9a10: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9a20: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
9a30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9a40: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
9a50: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
9a60: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
9a70: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
9a80: 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
9a90: 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
9aa0: 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
9ab0: 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
9ac0: 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
9ad0: 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
9ae0: 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
9af0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
9b00: 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
9b10: 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
9b20: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
9b30: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
9b40: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
9b50: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
9b60: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
9b70: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
9b80: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
9b90: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
9ba0: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
9bb0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
9bc0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
9bd0: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
9be0: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
9bf0: 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
9c00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
9c10: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
9c20: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
9c30: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
9c40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
9c50: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
9c60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
9c70: 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
9c80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9c90: 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
9ca0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
9cb0: 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
9cc0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
9cd0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 72 63 20 3d    */.  if( (rc =
9ce0: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
9cf0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9d00: 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
9d10: 28 70 50 61 67 65 72 29 29 29 0a 20 20 20 7c 7c  (pPager))).   ||
9d20: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
9d30: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
9d40: 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73  d, zMaster, nMas
9d50: 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29  ter, iHdrOff+4))
9d60: 0a 20 20 20 7c 7c 20 28 72 63 20 3d 20 77 72 69  .   || (rc = wri
9d70: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
9d80: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
9d90: 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
9da0: 29 29 0a 20 20 20 7c 7c 20 28 72 63 20 3d 20 77  )).   || (rc = w
9db0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
9dc0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9dd0: 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
9de0: 75 6d 29 29 0a 20 20 20 7c 7c 20 28 72 63 20 3d  um)).   || (rc =
9df0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9e00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
9e10: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
9e20: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
9e30: 2b 38 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  +8)).  ){.    re
9e40: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
9e50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9e60: 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30  f += (nMaster+20
9e70: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
9e80: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
9e90: 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49  >noSync;..  /* I
9ea0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
9eb0: 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
9ec0: 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
9ed0: 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
9ee0: 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
9ef0: 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
9f00: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
9f10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
9f20: 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
9f30: 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
9f40: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
9f50: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
9f60: 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
9f70: 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
9f80: 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
9f90: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
9fa0: 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
9fb0: 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
9fc0: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
9fd0: 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
9fe0: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
9ff0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
a000: 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
a010: 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
a020: 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
a030: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
a040: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
a050: 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
a060: 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
a070: 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
a080: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
a090: 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
a0a0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
a0b0: 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
a0c0: 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
a0d0: 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
a0e0: 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
a0f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
a100: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
a110: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
a120: 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
a130: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a140: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
a150: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
a160: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
a170: 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  mber. Return.** 
a180: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
a190: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
a1a0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
a1b0: 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  age is not .** a
a1c0: 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79  lready in memory
a1d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
a1e0: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
a1f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
a200: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
a210: 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a230: 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
a240: 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  /..  /* It is no
a250: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
a260: 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46   call to PcacheF
a270: 65 74 63 68 28 29 20 77 69 74 68 20 63 72 65 61  etch() with crea
a280: 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a  teFlag==0 to.  *
a290: 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f  * fail, since no
a2a0: 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
a2b0: 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d  cate dynamic mem
a2c0: 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  ory will be made
a2d0: 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73  ..  */.  (void)s
a2e0: 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
a2f0: 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
a300: 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b  e, pgno, 0, &p);
a310: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
a320: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65  /*.** Unless the
a330: 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72   pager is in err
a340: 6f 72 2d 73 74 61 74 65 2c 20 64 69 73 63 61 72  or-state, discar
a350: 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
a360: 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65  pages. If.** the
a370: 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72   pager is in err
a380: 6f 72 2d 73 74 61 74 65 2c 20 74 68 65 6e 20 74  or-state, then t
a390: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
a3a0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
a3b0: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
a3c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a3d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
a3e0: 3d 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  =pPager->errCode
a3f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
a400: 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
a410: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
a420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
a430: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
a440: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
a450: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
a460: 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
a470: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
a480: 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
a490: 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
a4a0: 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
a4b0: 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
a4c0: 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
a4d0: 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
a4e0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
a4f0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
a500: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
a510: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a520: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
a530: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
a540: 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
a550: 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
a560: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
a570: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
a580: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
a590: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
a5a0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
a5b0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
a5c0: 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
a5d0: 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
a5e0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
a5f0: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  eMode ){.    sql
a600: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
a610: 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
a620: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
a630: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a640: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
a650: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
a660: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a670: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
a680: 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
a690: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
a6a0: 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
a6b0: 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
a6c0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
a6d0: 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
a6e0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
a6f0: 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
a700: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
a710: 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
a720: 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
a730: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
a740: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
a750: 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
a760: 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
a770: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
a780: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a7a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
a7b0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
a7c0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
a7d0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
a7e0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
a7f0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
a800: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
a810: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
a820: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
a830: 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
a840: 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
a850: 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
a860: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
a870: 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
a880: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
a890: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
a8a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
a8b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
a8c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
a8d0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
a8e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
a8f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a900: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
a910: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
a920: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
a930: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
a940: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
a950: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
a960: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a970: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
a980: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
a990: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
a9a0: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
a9b0: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
a9c0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
a9d0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
a9e0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
a9f0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
aa00: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
aa10: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
aa20: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
aa30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
aa40: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
aa50: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
aa60: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
aa70: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
aa80: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
aa90: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
aaa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
aab0: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
aac0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
aad0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
aae0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
aaf0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
ab00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ab10: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
ab20: 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73    /* Always clos
ab30: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
ab40: 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
ab50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
ab60: 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  ck..    ** Other
ab70: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
ab80: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
ab90: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
aba0: 65 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64  e might.    ** d
abb0: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f  elete the file o
abc0: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
abd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
abe0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
abf0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71  er->jfd);.    sq
ac00: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
ac10: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
ac20: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
ac30: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
ac40: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41   0;.    releaseA
ac50: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
ac60: 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
ac70: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
ac80: 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20  ocked, somebody 
ac90: 65 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67  else might chang
aca0: 65 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a  e it. The.    **
acb0: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
acc0: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65  n Pager.dbSize e
acd0: 74 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  tc. might become
ace0: 20 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20   invalid if.    
acf0: 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  ** this happens.
ad00: 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79 2c 20 74   TODO: Really, t
ad10: 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  his doesn't need
ad20: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20   to be cleared. 
ad30: 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20     ** until the 
ad40: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
ad50: 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 70 61  heck fails in pa
ad60: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e  gerSharedLock().
ad70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
ad80: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
ad90: 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = 0;..    rc = o
ada0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
adb0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
adc0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
add0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
ade0: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
adf0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
ae00: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
ae10: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
ae20: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
ae30: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
ae40: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
ae50: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
ae60: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
ae70: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
ae80: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
ae90: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
aea0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
aeb0: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
aec0: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
aed0: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
aee0: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
aef0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
af00: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
af10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
af20: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
af30: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
af40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
af50: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
af60: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
af70: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
af80: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
af90: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
afa0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
afb0: 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NLOCK;.  }.}../*
afc0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
afd0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
afe0: 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52  ed when an IOERR
aff0: 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c  , CORRUPT or FUL
b000: 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68  L error.** may h
b010: 61 76 65 20 6f 63 63 75 72 65 64 2e 20 54 68 65  ave occured. The
b020: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
b030: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
b040: 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74  the pager .** st
b050: 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
b060: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
b070: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
b080: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
b090: 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74  er .** API funct
b0a0: 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
b0b0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
b0c0: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
b0d0: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
b0e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
b0f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
b100: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
b110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
b120: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
b130: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
b140: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
b150: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
b160: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
b170: 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  n error is clear
b180: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
b190: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
b1a0: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
b1b0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
b1c0: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
b1d0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
b1e0: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
b1f0: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
b200: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
b210: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
b220: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
b230: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
b240: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
b250: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
b260: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
b270: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b280: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b290: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
b2a0: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
b2b0: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
b2c0: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
b2d0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
b2e0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
b2f0: 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
b300: 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
b310: 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
b320: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
b330: 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
b340: 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
b350: 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
b360: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
b370: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
b380: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
b390: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
b3a0: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
b3b0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b3c0: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
b3d0: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
b3e0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
b3f0: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
b400: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
b410: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
b420: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a  OERR.  );.  if(.
b430: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
b440: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
b450: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
b460: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
b470: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
b480: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b490: 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  e = rc;.    if( 
b4a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
b4b0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20  AGER_UNLOCK .   
b4c0: 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
b4d0: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
b4e0: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
b4f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
b500: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
b510: 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64  already unlocked
b520: 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c  , call pager_unl
b530: 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20  ock() now to.   
b540: 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20     ** clear the 
b550: 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
b560: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
b570: 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a  pager-cache is .
b580: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74        ** complet
b590: 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20  ely empty..     
b5a0: 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f   */.      pager_
b5b0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
b5c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b5d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b5e0: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
b5f0: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
b600: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
b610: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
b620: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
b630: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b640: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
b650: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
b660: 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
b670: 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
b680: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
b690: 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
b6a0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
b6b0: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
b6c0: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
b6d0: 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
b6e0: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
b6f0: 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
b700: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
b710: 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20   file and clear 
b720: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
b730: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
b740: 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  hat.** there is 
b750: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
b760: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
b770: 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
b780: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f  connection.** to
b790: 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
b7a0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
b7b0: 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
b7c0: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a   this one) will.
b7d0: 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ** roll it back.
b7e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b7f0: 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
b800: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
b810: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74  error state, but
b820: 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
b830: 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
b840: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
b850: 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
b860: 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
b870: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
b880: 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
b890: 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
b8a0: 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
b8b0: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
b8c0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
b8d0: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
b8e0: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
b8f0: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
b900: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
b910: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
b920: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
b930: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
b940: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
b950: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
b960: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
b970: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
b980: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
b990: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
b9a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
b9b0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
b9c0: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
b9d0: 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
b9e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b9f0: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
ba00: 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
ba10: 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
ba20: 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
ba30: 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
ba40: 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
ba50: 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
ba60: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
ba70: 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
ba80: 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
ba90: 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
baa0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
bab0: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
bac0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
bad0: 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
bae0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
baf0: 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
bb00: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
bb10: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  n..** .** If the
bb20: 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
bb30: 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47  ER_SHARED or PAG
bb40: 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
bb50: 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  when this.** rou
bb60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
bb70: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72  it is a no-op (r
bb80: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
bb90: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
bba0: 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
bbb0: 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
bbc0: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
bbd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bbe0: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
bbf0: 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
bc00: 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
bc10: 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
bc20: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
bc30: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
bc40: 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
bc50: 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
bc60: 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
bc70: 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
bc80: 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
bc90: 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
bca0: 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
bcb0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
bcc0: 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
bcd0: 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
bce0: 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
bcf0: 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
bd00: 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
bd10: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
bd20: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
bd30: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
bd40: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
bd50: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
bd60: 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
bd70: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
bd80: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
bd90: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
bda0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
bdb0: 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
bdc0: 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
bdd0: 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
bde0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
bdf0: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
be00: 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
be10: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
be20: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
be30: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
be40: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
be50: 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
be60: 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
be70: 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
be80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
be90: 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
bea0: 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
beb0: 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
bec0: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
bed0: 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
bee0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
bef0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
bf00: 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
bf10: 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
bf20: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
bf30: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
bf40: 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
bf50: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
bf60: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
bf70: 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
bf80: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
bf90: 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
bfa0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
bfb0: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
bfc0: 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
bfd0: 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
bfe0: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
bff0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
c000: 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
c010: 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
c020: 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
c030: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
c040: 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
c050: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
c060: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
c070: 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
c080: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
c090: 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
c0a0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
c0b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
c0c0: 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e  nalized, if runn
c0d0: 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
c0e0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sive mode, the.*
c0f0: 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  * pager moves to
c100: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
c110: 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61  ate (and downgra
c120: 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  des the lock on 
c130: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
c140: 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  file accordingly
c150: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
c160: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
c170: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c180: 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47  de and is in PAG
c190: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c  ER_SYNCED state,
c1a0: 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20  .** it moves to 
c1b0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
c1c0: 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f   No locks are do
c1d0: 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75  wngraded when ru
c1e0: 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c  nning in.** excl
c1f0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
c200: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
c210: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
c220: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
c230: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
c240: 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
c250: 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
c260: 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
c270: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
c280: 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
c290: 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
c2a0: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
c2b0: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
c2c0: 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
c2d0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
c2e0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
c2f0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
c300: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
c310: 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
c320: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
c330: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
c340: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
c350: 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
c360: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
c370: 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
c380: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
c390: 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
c3a0: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
c3b0: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
c3c0: 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
c3d0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
c3e0: 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
c3f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c400: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
c410: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
c420: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
c430: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
c440: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
c450: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
c460: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
c470: 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
c480: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
c490: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
c4a0: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
c4b0: 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
c4c0: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
c4d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c4e0: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
c4f0: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
c500: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
c510: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
c520: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
c530: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
c540: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
c550: 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
c560: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
c570: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c580: 6a 66 64 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  jfd) ){..    /* 
c590: 54 4f 44 4f 3a 20 54 68 65 72 65 27 73 20 61 20  TODO: There's a 
c5a0: 70 72 6f 62 6c 65 6d 20 68 65 72 65 20 69 66 20  problem here if 
c5b0: 61 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 77  a journal-file w
c5c0: 61 73 20 6f 70 65 6e 65 64 20 69 6e 20 4d 45 4d  as opened in MEM
c5d0: 4f 52 59 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  ORY.    ** mode 
c5e0: 61 6e 64 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  and then the jou
c5f0: 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 63 68 61  rnal-mode is cha
c600: 6e 67 65 64 20 74 6f 20 54 52 55 4e 43 41 54 45  nged to TRUNCATE
c610: 20 6f 72 20 50 45 52 53 49 53 54 0a 20 20 20 20   or PERSIST.    
c620: 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  ** during the tr
c630: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
c640: 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20 63  code should be c
c650: 68 61 6e 67 65 64 20 74 6f 20 61 73 73 75 6d 65  hanged to assume
c660: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
c670: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 68 61   journal mode ha
c680: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 73 69  s not changed si
c690: 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  nce the transact
c6a0: 69 6f 6e 20 77 61 73 0a 20 20 20 20 2a 2a 20 73  ion was.    ** s
c6b0: 74 61 72 74 65 64 2e 20 41 6e 64 20 74 68 65 20  tarted. And the 
c6c0: 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
c6d0: 6e 61 6c 4d 6f 64 65 28 29 20 66 75 6e 63 74 69  nalMode() functi
c6e0: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  on should be.   
c6f0: 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 6d   ** changed to m
c700: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
c710: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 74  is is the case t
c720: 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20  oo..    */..    
c730: 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
c740: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
c750: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c760: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
c770: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c780: 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
c790: 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72  int isMemoryJour
c7a0: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73 4d  nal = sqlite3IsM
c7b0: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
c7c0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73 71  ->jfd);.      sq
c7d0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c7e0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
c7f0: 20 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f   if( !isMemoryJo
c800: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
c810: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
c820: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
c830: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
c840: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
c850: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
c860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
c870: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
c880: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
c890: 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20           && (rc 
c8a0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
c8b0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
c8c0: 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   0))==SQLITE_OK 
c8d0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
c8e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
c8f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c900: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
c910: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
c920: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
c930: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20  veMode .     || 
c940: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
c950: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
c960: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
c970: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
c980: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
c990: 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
c9a0: 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
c9b0: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
c9c0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
c9d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
c9e0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c9f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
ca00: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ca10: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ca20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
ca30: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ca40: 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20  DE_DELETE || rc 
ca50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ca60: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
ca70: 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
ca80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ca90: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
caa0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
cab0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
cac0: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
cad0: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
cae0: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
caf0: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
cb00: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
cb10: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
cb20: 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
cb30: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
cb40: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
cb50: 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  h);.#endif..    
cb60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
cb70: 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
cb80: 43 61 63 68 65 29 3b 0a 20 20 20 20 73 71 6c 69  Cache);.    sqli
cb90: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
cba0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
cbb0: 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
cbc0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
cbd0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
cbe0: 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  ec = 0;.  }..  i
cbf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
cc00: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
cc10: 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28   rc2 = osUnlock(
cc20: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
cc30: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
cc40: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
cc50: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
cc60: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
cc70: 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
cc80: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
cc90: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
cca0: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
ccb0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
ccc0: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
ccd0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
cce0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
ccf0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
cd00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  ;.  pPager->dbMo
cd10: 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  dified = 0;..  /
cd20: 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20  * TODO: Is this 
cd30: 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20  optimal? Why is 
cd40: 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61  the db size inva
cd50: 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a 20 20  lidated here .  
cd60: 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74 61  ** when the data
cd70: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
cd80: 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20   unlocked? */.  
cd90: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
cda0: 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ze = 0;.  sqlite
cdb0: 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
cdc0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
cdd0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
cde0: 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
cdf0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
ce00: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
ce10: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
ce20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
ce30: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  rc);.}../*.** Pa
ce40: 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
ce50: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
ce60: 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
ce70: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
ce80: 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
ce90: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
cea0: 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
ceb0: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
cec0: 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
ced0: 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
cee0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
cef0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
cf00: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
cf10: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
cf20: 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
cf30: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
cf40: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
cf50: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
cf60: 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
cf70: 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
cf80: 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
cf90: 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
cfa0: 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
cfb0: 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
cfc0: 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
cfd0: 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
cfe0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
cff0: 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
d000: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
d010: 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
d020: 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
d030: 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
d040: 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
d050: 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
d060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
d070: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
d080: 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
d090: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
d0a0: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
d0b0: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
d0c0: 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
d0d0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
d0e0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
d0f0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
d100: 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
d110: 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
d120: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
d130: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
d140: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
d150: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
d160: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
d170: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
d180: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
d190: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
d1a0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
d1b0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
d1c0: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
d1d0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
d1e0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
d1f0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
d200: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
d210: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
d220: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
d230: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
d240: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
d250: 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
d260: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
d270: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d280: 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
d290: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d2a0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
d2b0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
d2c0: 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
d2d0: 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
d2e0: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
d2f0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
d300: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
d310: 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
d320: 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
d330: 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
d340: 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
d350: 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
d360: 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
d370: 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
d380: 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
d390: 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
d3a0: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
d3b0: 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
d3c0: 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
d3d0: 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
d3e0: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
d3f0: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
d400: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  al..**.** The is
d410: 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73  MainJrnl flag is
d420: 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
d430: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
d440: 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a  ck journal and.*
d450: 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20  * false for the 
d460: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d470: 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c  l.  The main rol
d480: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73  lback journal us
d490: 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20  es.** checksums 
d4a0: 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
d4b0: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
d4c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
d4d0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
d4e0: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
d4f0: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
d500: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
d510: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
d520: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
d530: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
d540: 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
d550: 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
d560: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
d570: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
d580: 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
d590: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
d5a0: 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
d5b0: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
d5c0: 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
d5d0: 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
d5e0: 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
d5f0: 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
d600: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
d610: 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
d620: 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
d630: 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
d640: 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
d650: 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
d660: 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
d670: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
d680: 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
d690: 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
d6a0: 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
d6b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
d6c0: 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
d6d0: 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
d6e0: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
d6f0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
d700: 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
d710: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
d720: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
d730: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d740: 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
d750: 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
d760: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
d770: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
d780: 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
d790: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d7a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
d7b0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
d7c0: 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
d7d0: 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
d7e0: 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
d7f0: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
d800: 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
d810: 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
d820: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
d830: 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
d840: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
d850: 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
d860: 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
d870: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
d880: 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
d890: 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
d8a0: 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
d8b0: 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
d8c0: 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
d8d0: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
d8e0: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
d8f0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
d900: 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
d910: 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
d920: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
d930: 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
d940: 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
d950: 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
d960: 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
d970: 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
d980: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
d990: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
d9a0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
d9b0: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
d9c0: 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
d9d0: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
d9e0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
d9f0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
da00: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
da10: 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
da20: 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
da30: 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
da40: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
da50: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
da60: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
da70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
da90: 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
daa0: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
dab0: 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
dac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dad0: 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
dae0: 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
daf0: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 36 34  ournal. */.  i64
db00: 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
db10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
db20: 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
db30: 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
db40: 69 6e 74 20 69 73 53 61 76 65 70 6e 74 2c 20 20  int isSavepnt,  
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db60: 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
db70: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
db80: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
db90: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
dba0: 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
dbb0: 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
dbc0: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  yed back */.){. 
dbd0: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
dbe0: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
dbf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
dc00: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
dc10: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
dc20: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc40: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
dc50: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
dc60: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
dc70: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
dc80: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
dc90: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
dca0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
dcb0: 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20    u8 *aData;    
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
dce0: 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
dcf0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
dd00: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
dd10: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
dd20: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
dd30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dd40: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
dd50: 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
dd60: 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
dd70: 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
dd80: 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
dd90: 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
dda0: 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
ddb0: 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
ddc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
ddd0: 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
dde0: 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
ddf0: 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
de00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
de10: 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
de20: 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
de30: 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
de40: 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
de50: 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
de60: 20 61 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50   aData = (u8*)pP
de70: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
de80: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
de90: 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
dea0: 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
deb0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
dec0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
ded0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
dee0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
def0: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
df00: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
df10: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
df20: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
df30: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
df40: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
df50: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
df60: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
df70: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
df80: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
df90: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
dfa0: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
dfb0: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
dfc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dfd0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
dfe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
dff0: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
e000: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
e010: 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
e020: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e030: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
e040: 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
e050: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
e060: 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
e070: 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
e080: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
e090: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
e0a0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
e0b0: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
e0c0: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
e0d0: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
e0e0: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
e0f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
e100: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
e110: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
e120: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
e130: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
e140: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
e150: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
e160: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
e170: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
e180: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
e190: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
e1a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
e1b0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
e1c0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
e1d0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
e1e0: 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
e1f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e200: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
e210: 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
e220: 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
e230: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
e240: 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
e250: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e260: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
e270: 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
e280: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
e290: 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
e2a0: 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
e2b0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
e2c0: 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
e2d0: 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
e2e0: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
e2f0: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
e300: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e310: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
e320: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e  .  }..  if( pDon
e330: 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
e340: 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
e350: 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
e360: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
e370: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
e380: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
e390: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
e3a0: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
e3b0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
e3c0: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
e3d0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
e3e0: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
e3f0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
e400: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
e410: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
e420: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
e430: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
e440: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
e450: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
e460: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
e470: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
e480: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
e490: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
e4a0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
e4b0: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
e4c0: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
e4d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
e4e0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
e4f0: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
e500: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
e510: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
e520: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
e530: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
e540: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
e550: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
e560: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
e570: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e580: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
e590: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
e5a0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
e5b0: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
e5c0: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
e5d0: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
e5e0: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
e5f0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
e600: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
e610: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
e620: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
e630: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
e640: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
e650: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
e660: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
e670: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
e680: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
e690: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
e6a0: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
e6b0: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
e6c0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
e6d0: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
e6e0: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
e6f0: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
e700: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
e710: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
e720: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
e730: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
e740: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
e750: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
e760: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
e770: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
e780: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
e790: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
e7a0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
e7b0: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
e7c0: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
e7d0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
e7e0: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
e7f0: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
e800: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
e810: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
e820: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
e830: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
e840: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
e850: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
e860: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
e870: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
e880: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
e890: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
e8a0: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
e8b0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
e8c0: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
e8d0: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
e8e0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
e8f0: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
e900: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
e910: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
e920: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
e930: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
e940: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
e950: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
e960: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
e970: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
e980: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
e990: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
e9a0: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
e9b0: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
e9c0: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
e9d0: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
e9e0: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
e9f0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
ea00: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
ea10: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
ea20: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
ea30: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
ea40: 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
ea50: 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
ea60: 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
ea70: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
ea80: 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
ea90: 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
eaa0: 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
eab0: 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
eac0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
ead0: 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
eae0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
eaf0: 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
eb00: 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
eb10: 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
eb20: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
eb30: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
eb40: 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52  pgno);.  PAGERTR
eb50: 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
eb60: 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
eb70: 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
eb80: 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
eb90: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
eba0: 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
ebb0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
ebc0: 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20 20  e, aData),.     
ebd0: 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
ebe0: 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
ebf0: 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
ec00: 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
ec10: 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
ec20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29  PAGER_EXCLUSIVE)
ec30: 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  .   && (pPg==0 |
ec40: 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
ec50: 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
ec60: 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28  )).   && isOpen(
ec70: 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 29 7b  pPager->fd).  ){
ec80: 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
ec90: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
eca0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
ecb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ecc0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
ecd0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
ece0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
ecf0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
ed00: 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
ed10: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
ed20: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
ed30: 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
ed40: 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69  }else if( !isMai
ed50: 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20  nJrnl && pPg==0 
ed60: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
ed70: 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
ed80: 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61  of a savepoint a
ed90: 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20  nd data was not 
eda0: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
edb0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
edc0: 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
edd0: 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68  ot in-memory, th
ede0: 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69  ere is a potenti
edf0: 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65  al.    ** proble
ee00: 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65  m. When the page
ee10: 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64   is next fetched
ee20: 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
ee30: 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a  ayer, it .    **
ee40: 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
ee50: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
ee60: 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20  file, which may 
ee70: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20  or may not be . 
ee80: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a     ** current. .
ee90: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
eea0: 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65  ere are a couple
eeb0: 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61   of different wa
eec0: 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ys this can happ
eed0: 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74  en. All are quit
eee0: 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65  e.    ** obscure
eef0: 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  . When running i
ef00: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  n synchronous mo
ef10: 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c  de, this can onl
ef20: 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a  y happen .    **
ef30: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
ef40: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
ef50: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
ef60: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ef70: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f  , then.    ** po
ef80: 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f  pulated, then mo
ef90: 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ved using sqlite
efa0: 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
efb0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
efc0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
efd0: 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d  to add an in-mem
efe0: 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20  ory page to the 
eff0: 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cache containing
f000: 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
f010: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
f020: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
f030: 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
f040: 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20  s dirty .    ** 
f050: 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72  and if the pager
f060: 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72   requires a jour
f070: 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d  nal-sync, then m
f080: 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
f090: 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e  .    ** requirin
f0a0: 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  g a journal-sync
f0b0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72   before it is wr
f0c0: 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
f0d0: 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
f0e0: 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28  pnt );.    if( (
f0f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f100: 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
f110: 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29   pgno, &pPg, 1))
f120: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f130: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
f140: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66      }.    pPg->f
f150: 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
f160: 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71  EED_READ;.    sq
f170: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
f180: 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
f190: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
f1a0: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
f1b0: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
f1c0: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
f1d0: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
f1e0: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
f1f0: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
f200: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
f210: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
f220: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
f230: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
f240: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
f250: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
f260: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
f270: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
f280: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
f290: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
f2a0: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
f2b0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
f2c0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
f2d0: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
f2e0: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
f2f0: 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
f300: 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
f310: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
f320: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f330: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
f340: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
f350: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
f360: 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
f370: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4d     }.    if( isM
f380: 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53  ainJrnl && (!isS
f390: 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73  avepnt || *pOffs
f3a0: 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  et<=pPager->jour
f3b0: 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20  nalHdr) ){.     
f3c0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65   /* If the conte
f3d0: 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
f3e0: 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f   were just resto
f3f0: 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  red from the mai
f400: 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  n .      ** jour
f410: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
f420: 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ts content must 
f430: 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20  be as they were 
f440: 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  when the .      
f450: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
f460: 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
f470: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
f480: 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61   can mark the pa
f490: 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63  ge.      ** as c
f4a0: 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72  lean, since ther
f4b0: 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65  e will be no nee
f4c0: 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75  d to write it ou
f4d0: 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20 20 20  t to the..      
f4e0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  **.      ** Ther
f4f0: 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69  e is one excepti
f500: 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e  on to this rule.
f510: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
f520: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20  being rolled.   
f530: 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61     ** back as pa
f540: 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  rt of a savepoin
f550: 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29  t (or statement)
f560: 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61   rollback from a
f570: 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79  n .      ** unsy
f580: 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
f590: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
f5a0: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
f5b0: 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20  s not safe.     
f5c0: 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20   ** to mark the 
f5d0: 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54  page as clean. T
f5e0: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d  his is because m
f5f0: 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20  arking the page 
f600: 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61  as.      ** clea
f610: 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65  n will clear the
f620: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
f630: 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65   flag. Since the
f640: 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a   page is.      *
f650: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
f660: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72   journal file (r
f670: 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72  ecorded in Pager
f680: 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64  .pInJournal) and
f690: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
f6a0: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
f6b0: 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69  ag is cleared, i
f6c0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
f6d0: 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a  itten to.      *
f6e0: 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  * again within t
f6f0: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
f700: 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b   it will be mark
f710: 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a  ed as dirty but.
f720: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
f730: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
f740: 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65  g will not be se
f750: 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e  t. It could then
f760: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20   potentially.   
f770: 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e     ** be written
f780: 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61   out into the da
f790: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
f7a0: 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  re its journal f
f7b0: 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67  ile.      ** seg
f7c0: 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20  ment is synced. 
f7d0: 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  If a crash occur
f7e0: 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c  s during or foll
f7f0: 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20  owing this,.    
f800: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f    ** database co
f810: 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73  rruption may ens
f820: 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ue..      */.   
f830: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
f840: 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
f850: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
f860: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
f870: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
f880: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
f890: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
f8a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
f8b0: 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
f8c0: 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
f8d0: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
f8e0: 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
f8f0: 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
f900: 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
f910: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
f920: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
f930: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
f940: 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
f950: 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
f960: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
f970: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f980: 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
f990: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
f9a0: 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
f9b0: 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
f9c0: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
f9d0: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
f9e0: 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
f9f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
fa00: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
fa10: 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
fa20: 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
fa30: 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54  GE_TEST)./*.** T
fa40: 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
fa50: 73 20 61 68 65 61 64 20 69 6e 74 6f 20 74 68 65  s ahead into the
fa60: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
fa70: 6c 65 20 61 6e 64 20 64 65 74 65 72 6d 69 6e 65  le and determine
fa80: 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  s.** whether or 
fa90: 6e 6f 74 20 74 68 65 20 6e 65 78 74 20 72 65 63  not the next rec
faa0: 6f 72 64 20 28 74 68 65 20 72 65 63 6f 72 64 20  ord (the record 
fab0: 74 68 61 74 20 62 65 67 69 6e 73 20 61 74 20 66  that begins at f
fac0: 69 6c 65 0a 2a 2a 20 6f 66 66 73 65 74 20 70 50  ile.** offset pP
fad0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fae0: 29 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  ) is a well-form
faf0: 65 64 20 70 61 67 65 20 72 65 63 6f 72 64 20 63  ed page record c
fb00: 6f 6e 73 69 73 74 69 6e 67 0a 2a 2a 20 6f 66 20  onsisting.** of 
fb10: 61 20 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d  a valid page num
fb20: 62 65 72 2c 20 70 50 61 67 65 2d 3e 70 61 67 65  ber, pPage->page
fb30: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 63 6f  Size bytes of co
fb40: 6e 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a  ntent, followed.
fb50: 2a 2a 20 62 79 20 61 20 76 61 6c 69 64 20 63 68  ** by a valid ch
fb60: 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecksum..**.** Th
fb70: 65 20 70 61 67 65 72 20 6e 65 76 65 72 20 6e 65  e pager never ne
fb80: 65 64 73 20 74 6f 20 6b 6e 6f 77 20 74 68 69 73  eds to know this
fb90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 20   in order to do 
fba0: 69 74 73 20 6a 6f 62 2e 20 20 20 54 68 69 73 0a  its job.   This.
fbb0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  ** routine is on
fbc0: 6c 79 20 75 73 65 64 20 66 72 6f 6d 20 77 69 74  ly used from wit
fbd0: 68 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  h assert() and t
fbe0: 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
fbf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fc00: 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
fc10: 50 61 67 65 49 73 56 61 6c 69 64 28 50 61 67 65  PageIsValid(Page
fc20: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
fc30: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
fc40: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
fc50: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
fc60: 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  e */.  u32 cksum
fc70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
fc80: 68 65 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  he page checksum
fc90: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
fca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
fcb0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 72  turn code from r
fcc0: 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  ead operations *
fcd0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
fce0: 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68 65 20   *fd;    /* The 
fcf0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
fd00: 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 61 72  from which we ar
fd10: 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20 20 75  e reading */.  u
fd20: 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
fd30: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
fd40: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  f the page */.. 
fd50: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
fd60: 65 20 6e 75 6d 62 65 72 20 68 65 61 64 65 72 20  e number header 
fd70: 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61 67 65 72  */.  fd = pPager
fd80: 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  ->jfd;.  rc = re
fd90: 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61  ad32bits(fd, pPa
fda0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
fdb0: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
fdc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
fdd0: 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
fe00: 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
fe10: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
fe20: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
fe30: 61 67 65 72 29 20 29 7b 20 72 65 74 75 72 6e 20  ager) ){ return 
fe40: 30 3b 20 7d 20 20 20 20 20 20 20 20 20 2f 2a 4e  0; }         /*N
fe50: 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
fe60: 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
fe70: 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72 65 74 75  ->dbSize ){ retu
fe80: 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
fea0: 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52  O_TEST*/..  /* R
feb0: 65 61 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ead the checksum
fec0: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
fed0: 32 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72  2bits(fd, pPager
fee0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70 50 61  ->journalOff+pPa
fef0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
ff00: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
ff10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ff20: 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff50: 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20  NO_TEST*/..  /* 
ff60: 52 65 61 64 20 74 68 65 20 64 61 74 61 20 61 6e  Read the data an
ff70: 64 20 76 65 72 69 66 79 20 74 68 65 20 63 68 65  d verify the che
ff80: 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61 74 61  cksum */.  aData
ff90: 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e   = (u8*)pPager->
ffa0: 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
ffb0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
ffc0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
ffd0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
ffe0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
fff0: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
10000 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72  LITE_OK ){ retur
10010 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10040 54 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 5f  T*/.  if( pager_
10050 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
10060 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 20 72  ata)!=cksum ){ r
10070 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
10080 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10090 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63 68 20  T*/..  /* Reach 
100a0 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c 79 20  this point only 
100b0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 76  if the page is v
100c0 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  alid */.  return
100d0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
100e0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
100f0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
10100 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
10110 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  ) */../*.** Para
10120 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
10130 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
10140 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10150 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
10160 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
10170 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
10180 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10190 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
101a0 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
101b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
101c0 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
101d0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
101e0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
101f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
10200 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
10210 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
10220 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
10230 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
10240 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
10250 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
10260 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
10270 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
10280 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
10290 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72  ** When a master
102a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
102b0 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20   created, it is 
102c0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
102d0 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  he names .** of 
102e0 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
102f0 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61   journals, one a
10300 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f  fter another, fo
10310 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38  rmatted as utf-8
10320 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78   .** encoded tex
10330 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61  t. The end of ea
10340 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
10350 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20   file is marked 
10360 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74  with a .** nul-t
10370 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28  erminator byte (
10380 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20  0x00). i.e. the 
10390 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
103a0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
103b0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  nal.** file for 
103c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
103d0 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61  volving two data
103e0 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a  bases might be:.
103f0 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62  **.**   "/home/b
10400 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/a.db-journal
10410 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62  \x00/home/bill/b
10420 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22  .db-journal\x00"
10430 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20  .**.** A master 
10440 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
10450 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64   only be deleted
10460 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73   once all of its
10470 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e   child .** journ
10480 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f  als have been ro
10490 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
104a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
104b0 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  eads the content
104c0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  s of the master-
104d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
104e0 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  o .** memory and
104f0 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65   loops through e
10500 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ach of the child
10510 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20   journal names. 
10520 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c  For.** each chil
10530 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68  d journal, it ch
10540 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  ecks if:.**.**  
10550 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
10560 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20  journal exists, 
10570 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a  and if so.**   *
10580 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
10590 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61  urnal contains a
105a0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61   reference to ma
105b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ster journal .**
105c0 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65       file zMaste
105d0 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69  r.**.** If a chi
105e0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
105f0 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74  e found that mat
10600 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65  ches both of the
10610 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f   criteria.** abo
10620 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ve, this functio
10630 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75  n returns withou
10640 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
10650 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a  . Otherwise, if.
10660 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64  ** no such child
10670 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
10680 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73  found, file zMas
10690 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66  ter is deleted f
106a0 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d  rom.** the file-
106b0 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c  system using sql
106c0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
106d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
106e0 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73  rror within this
106f0 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72   function, an er
10700 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10710 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  rned. This.** fu
10720 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
10730 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69   memory by calli
10740 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ng sqlite3Malloc
10750 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61  (). If an alloca
10760 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  tion.** fails, S
10770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
10780 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10790 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20  se, if no IO or 
107a0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a  malloc errors .*
107b0 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  * occur, SQLITE_
107c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
107d0 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73  **.** TODO: This
107e0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
107f0 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f  tes a single blo
10800 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  ck of memory to 
10810 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69  load.** the enti
10820 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
10830 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10840 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75  l file. This cou
10850 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c  ld be.** a coupl
10860 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f  e of kilobytes o
10870 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c  r so - potential
10880 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ly larger than t
10890 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65  he page .** size
108a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
108b0 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
108c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
108d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
108e0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
108f0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
10900 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
10910 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10920 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10930 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
10940 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20  _file *pMaster; 
10950 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d     /* Malloc'd m
10960 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
10970 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
10980 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10990 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20  *pJournal;   /* 
109a0 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a  Malloc'd child-j
109b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
109c0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  riptor */.  char
109d0 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
109e0 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
109f0 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
10a00 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
10a10 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
10a20 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
10a30 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
10a40 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
10a50 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
10a60 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
10a70 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
10a80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10a90 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
10aa0 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
10ab0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10ac0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
10ad0 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
10ae0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10af0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
10b00 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
10b10 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
10b20 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
10b30 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
10b40 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
10b50 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
10b60 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
10b70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10b80 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
10b90 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
10ba0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
10bb0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
10bc0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
10bd0 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
10be0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
10bf0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
10c00 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
10c10 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
10c20 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
10c30 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
10c40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
10c50 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
10c60 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
10c70 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10c80 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
10c90 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
10ca0 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
10cb0 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
10cc0 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
10cd0 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
10ce0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
10cf0 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
10d00 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
10d10 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
10d20 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
10d30 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
10d40 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
10d50 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
10d60 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
10d70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
10d80 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
10d90 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
10da0 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
10db0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
10dc0 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
10dd0 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
10de0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
10df0 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
10e00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10e10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
10e20 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
10e30 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
10e40 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
10e50 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
10e60 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
10e70 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
10e80 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
10e90 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
10ea0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
10eb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10ec0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
10ed0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
10ee0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
10ef0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
10f00 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
10f10 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
10f20 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
10f30 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  l ){.      int e
10f40 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20  xists;.      rc 
10f50 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
10f60 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
10f70 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
10f80 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
10f90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10fb0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
10fc0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
10fd0 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74  .      if( exist
10fe0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
10ff0 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
11000 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
11010 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
11020 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
11030 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
11040 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
11050 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
11060 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
11070 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
11080 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
11090 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
110a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
110b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
110c0 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
110d0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
110e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
110f0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
11100 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
11110 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11120 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
11130 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
11140 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
11150 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11170 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
11180 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
11190 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
111a0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
111b0 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
111c0 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
111d0 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
111e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
111f0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
11200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11220 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11230 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
11240 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
11250 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
11260 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
11270 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
11280 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
11290 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
112a0 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
112b0 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
112c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
112d0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
112e0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
112f0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
11310 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
11320 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
11330 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
11340 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
11350 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
11360 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
11370 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
11380 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
11390 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
113a0 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
113b0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
113c0 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
113d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
113e0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
113f0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11400 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
11410 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11420 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
11430 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
11440 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11450 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61  n is used to cha
11460 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73  nge the actual s
11470 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
11480 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20  ase .** file in 
11490 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
114a0 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
114b0 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ns when committi
114c0 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
114d0 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  ,.** or rolling 
114e0 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
114f0 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f  on (including ro
11500 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
11510 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a  -journal)..**.**
11520 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
11530 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
11540 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78  t open, or an ex
11550 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
11560 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69  not.** held, thi
11570 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
11580 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
11590 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  , the size of th
115a0 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61  e file is.** cha
115b0 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
115c0 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
115d0 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
115e0 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a  s). If the file.
115f0 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  ** on disk is cu
11600 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
11610 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
11620 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
11630 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
11640 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
11650 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
11660 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
11670 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
11680 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
11690 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
116a0 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
116b0 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
116c0 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
116d0 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
116e0 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
116f0 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
11700 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
11710 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
11720 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
11730 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
11740 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
11750 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
11760 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
11770 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
11780 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
11790 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
117a0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
117b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
117c0 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
117d0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
117e0 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
117f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
11800 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
11810 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
11820 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
11830 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
11840 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11850 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
11860 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11870 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
11880 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
11890 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65  CLUSIVE && isOpe
118a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
118b0 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
118c0 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
118d0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
118e0 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
118f0 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
11900 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
11910 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11920 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
11930 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
11940 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
11950 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
11960 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
11970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11980 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
11990 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
119a0 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
119b0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
119c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
119d0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
119e0 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
119f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11a00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11a10 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
11a20 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
11a30 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
11a40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11a50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11a60 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
11a70 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
11a80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11a90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11aa0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
11ab0 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
11ac0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
11ad0 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
11ae0 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
11af0 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
11b00 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
11b10 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
11b20 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
11b30 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
11b40 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
11b50 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
11b60 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
11b70 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
11b80 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
11b90 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
11ba0 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
11bb0 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
11bc0 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
11bd0 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
11be0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
11bf0 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
11c00 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
11c10 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
11c20 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
11c30 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
11c40 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
11c50 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
11c60 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
11c70 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
11c80 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
11c90 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
11ca0 6e 64 65 64 20 75 70 20 74 6f 20 35 31 32 20 69  nded up to 512 i
11cb0 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20  f.** it is less 
11cc0 74 68 61 6e 20 35 31 32 2c 20 6f 72 20 72 6f 75  than 512, or rou
11cd0 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
11ce0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
11cf0 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
11d00 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
11d10 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
11d20 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
11d30 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
11d40 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
11d50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
11d60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
11d70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
11d80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11d90 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
11da0 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
11db0 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
11dc0 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
11dd0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11de0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
11df0 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
11e00 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
11e10 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
11e20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
11e30 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
11e40 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
11e50 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
11e60 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
11e70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
11e80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
11e90 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
11ea0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
11eb0 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
11ec0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
11ed0 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  sectorSize>MAX_S
11ee0 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
11ef0 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
11f00 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
11f10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
11f20 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53  ctorSize = MAX_S
11f30 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
11f40 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
11f50 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
11f60 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
11f70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11f80 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
11f90 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
11fa0 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
11fb0 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
11fc0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
11fd0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
11fe0 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
11ff0 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
12000 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
12010 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
12020 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
12030 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
12040 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
12050 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
12060 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
12070 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
12080 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
12090 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
120a0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
120b0 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
120c0 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
120d0 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
120e0 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
120f0 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
12100 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12110 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12120 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
12130 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
12140 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
12150 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
12160 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12170 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
12180 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
12190 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
121a0 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
121b0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
121c0 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
121d0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
121e0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
121f0 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
12200 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
12210 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
12220 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
12230 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
12240 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
12250 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
12260 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20   case..**  (7)  
12270 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
12280 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
12290 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
122a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
122b0 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e  l.**       name.
122c0 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20    The value may 
122d0 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74  be zero (indicat
122e0 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
122f0 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  no master.**    
12300 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20     journal.).** 
12310 20 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66   (8)  N bytes of
12320 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12330 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e  nal name.  The n
12340 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d  ame will be nul-
12350 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20  terminated.**   
12360 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65      and might be
12370 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68   shorter than th
12380 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
12390 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66  m (5).  If the f
123a0 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  irst byte.**    
123b0 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69     of the name i
123c0 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72  s \000 then ther
123d0 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a  e is no master j
123e0 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73  ournal.  The mas
123f0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
12400 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f  rnal name is sto
12410 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  red in UTF-8..**
12420 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (9)  Zero or m
12430 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
12440 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
12450 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
12460 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
12470 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
12480 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
12490 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
124a0 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
124b0 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
124c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
124d0 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
124e0 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
124f0 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 38 20  ean the first 8 
12500 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
12510 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
12520 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
12530 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
12540 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  9th item..**.** 
12550 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
12560 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
12570 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
12580 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
12590 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
125a0 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
125b0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
125c0 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
125d0 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
125e0 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
125f0 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
12600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12610 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
12620 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
12630 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
12640 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
12650 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
12660 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
12670 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
12680 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12690 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
126a0 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
126b0 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
126c0 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
126d0 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
126e0 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
126f0 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
12700 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
12710 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
12720 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
12730 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
12740 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
12750 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
12760 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
12770 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
12780 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
12790 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
127a0 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
127b0 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
127c0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
127d0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
127e0 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
127f0 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
12800 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
12810 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
12820 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
12830 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
12840 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
12850 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
12860 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
12870 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
12880 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
12890 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
128a0 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
128b0 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
128c0 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
128d0 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
128e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
128f0 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
12900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12910 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
12920 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
12930 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
12940 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
12950 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
12960 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
12970 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
12980 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
12990 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
129a0 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
129b0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
129c0 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
129d0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
129e0 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
129f0 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
12a00 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
12a10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
12a20 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
12a30 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
12a40 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
12a50 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
12a60 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
12a70 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
12a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
12a90 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
12aa0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
12ab0 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
12ac0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
12ad0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
12ae0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
12af0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12b00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12b10 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
12b20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
12b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12b40 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
12b50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
12b60 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
12b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
12b80 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
12b90 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
12ba0 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
12bb0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
12bc0 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
12bd0 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
12be0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12bf0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
12c00 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
12c10 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
12c20 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
12c30 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
12c40 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
12c50 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
12c60 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
12c70 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
12c80 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
12c90 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
12ca0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
12cb0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
12cc0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
12cd0 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
12ce0 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
12cf0 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
12d00 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12d10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
12d20 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
12d30 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
12d40 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
12d50 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
12d60 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
12d70 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
12d80 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
12d90 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
12da0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
12db0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
12dc0 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
12dd0 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
12de0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
12df0 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
12e00 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
12e10 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
12e20 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
12e30 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
12e40 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
12e50 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
12e60 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
12e70 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
12e80 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
12e90 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
12ea0 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
12eb0 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
12ec0 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
12ed0 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
12ee0 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
12ef0 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
12f00 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
12f10 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
12f20 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
12f30 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
12f40 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
12f50 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78  unix.c,.  **  mx
12f60 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c  Pathname is 512,
12f70 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
12f80 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75  me as the minimu
12f90 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75  m allowable valu
12fa0 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53  e.  ** for pageS
12fb0 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ize..  */.  zMas
12fc0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
12fd0 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
12fe0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
12ff0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
13000 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
13010 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13020 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
13030 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
13040 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
13050 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
13060 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
13070 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
13080 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
13090 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
130a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
130b0 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
130c0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
130d0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
130e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
130f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
13100 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
13110 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
13120 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
13130 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
13140 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
13150 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
13160 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
13170 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
13180 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
13190 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
131a0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
131b0 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
131c0 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
131d0 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
131e0 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
131f0 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
13200 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
13210 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
13220 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
13230 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
13240 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
13250 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
13260 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
13270 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
13280 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
13290 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
132a0 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
132b0 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
132c0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
132d0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
132e0 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
132f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13300 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
13310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13320 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
13330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
13350 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
13360 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
13370 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
13380 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
13390 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
133a0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
133b0 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
133c0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
133d0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
133e0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
133f0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
13400 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
13410 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
13420 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
13430 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
13440 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
13450 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
13460 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
13470 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
13480 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
13490 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
134a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
134b0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
134c0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
134d0 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
134e0 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
134f0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
13500 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
13510 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
13520 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
13530 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
13540 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
13550 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
13560 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
13570 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
13580 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
13590 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
135a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
135b0 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
135c0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
135d0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
135e0 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
135f0 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
13600 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
13610 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
13620 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
13630 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
13640 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
13650 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
13660 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
13670 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
13680 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
13690 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
136a0 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
136b0 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
136c0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
136d0 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
136e0 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
136f0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
13700 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
13710 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
13720 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
13730 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13740 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
13750 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
13760 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
13770 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
13780 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
13790 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
137a0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
137b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
137c0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
137d0 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
137e0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
137f0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
13800 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
13810 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
13820 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
13830 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
13840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13850 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
13860 20 20 74 65 73 74 63 61 73 65 28 20 6e 52 65 63    testcase( nRec
13870 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 0a 20 20  ==0 && !isHot.  
13880 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
13890 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
138a0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
138b0 65 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)!=pPager->jou
138c0 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20 20  rnalOff.        
138d0 20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61 67   && ((szJ - pPag
138e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
138f0 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
13900 70 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20 20  pPager))>0.     
13910 20 20 20 20 26 26 20 70 61 67 65 72 4e 65 78 74      && pagerNext
13920 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61 6c  JournalPageIsVal
13930 69 64 28 70 50 61 67 65 72 29 0a 20 20 20 20 29  id(pPager).    )
13940 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  ;.    if( nRec==
13950 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
13960 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
13970 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
13980 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13990 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
139a0 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
139b0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
139c0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
139d0 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
139e0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
139f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
13a00 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
13a10 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
13a20 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
13a30 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
13a40 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
13a50 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
13a60 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
13a70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
13a80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13a90 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
13aa0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
13ab0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
13ac0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
13ad0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
13ae0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13af0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
13b00 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
13b10 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13b20 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
13b30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
13b40 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
13b50 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
13b60 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
13b70 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
13b80 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
13b90 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
13ba0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
13bb0 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
13bc0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
13bd0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
13be0 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  age(pPager, 1, &
13bf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13c00 66 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ff, 0, 0);.     
13c10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13c20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
13c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
13c40 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
13c50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13c60 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
13c70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
13c80 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
13c90 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
13ca0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
13cb0 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
13cc0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   to rollback, th
13cd0 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
13ce0 69 73 20 70 72 6f 62 61 62 6c 79 0a 20 20 20 20  is probably.    
13cf0 20 20 20 20 20 20 2a 2a 20 67 6f 69 6e 67 20 74        ** going t
13d00 6f 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 63  o end up being c
13d10 6f 72 72 75 70 74 2e 20 20 49 74 20 69 73 20 63  orrupt.  It is c
13d20 6f 72 72 75 70 74 20 74 6f 20 75 73 2c 20 61 6e  orrupt to us, an
13d30 79 68 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20  yhow..          
13d40 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  ** Perhaps the n
13d50 65 78 74 20 70 72 6f 63 65 73 73 20 74 6f 20 63  ext process to c
13d60 6f 6d 65 20 61 6c 6f 6e 67 20 63 61 6e 20 66 69  ome along can fi
13d70 78 20 69 74 2e 2e 2e 2e 0a 20 20 20 20 20 20 20  x it.....       
13d80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
13d90 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
13da0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
13db0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
13dc0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
13dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13de0 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
13df0 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
13e00 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
13e10 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
13e20 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
13e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
13e40 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
13e50 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
13e60 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
13e70 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
13e80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
13e90 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
13ea0 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
13eb0 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
13ec0 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
13ed0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
13ee0 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
13ef0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
13f00 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
13f10 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  modified..  */. 
13f20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50 61   assert(.    pPa
13f30 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
13f40 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69  s==0 ||.    sqli
13f50 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
13f60 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
13f70 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
13f80 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45  ANGED,0)>=SQLITE
13f90 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  _OK.  );..  /* I
13fa0 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
13fb0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
13fc0 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
13fd0 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
13fe0 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
13ff0 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
14000 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
14010 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
14020 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
14030 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
14040 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
14050 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
14060 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
14070 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
14080 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
14090 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
140a0 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
140b0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
140c0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
140d0 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
140e0 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
140f0 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
14100 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
14110 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
14120 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
14130 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
14140 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
14150 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
14160 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
14170 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
14180 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
14190 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
141a0 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
141b0 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
141c0 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
141d0 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
141e0 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
141f0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
14200 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
14210 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
14220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14230 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
14240 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
14250 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
14260 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
14270 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
14280 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
14290 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
142a0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
142b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
142c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
142d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
142e0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
142f0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
14300 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
14310 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
14320 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
14330 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
14340 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
14350 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
14360 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
14370 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
14380 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
14390 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
143a0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
143b0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
143c0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
143d0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
143e0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
143f0 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
14400 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
14410 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
14420 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14430 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
14440 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
14450 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
14460 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
14470 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
14480 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
14490 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
144a0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
144b0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
144c0 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
144d0 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
144e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
144f0 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
14500 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
14510 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
14520 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14530 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
14540 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
14550 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
14560 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
14570 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
14580 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
14590 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
145a0 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
145b0 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
145c0 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
145d0 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
145e0 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
145f0 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
14600 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
14610 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
14620 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
14630 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
14640 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
14650 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
14660 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
14670 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
14680 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
14690 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
146a0 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
146b0 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
146c0 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
146d0 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
146e0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
146f0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
14700 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
14710 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
14720 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
14730 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
14740 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
14750 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
14760 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14770 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
14780 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
14790 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
147a0 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
147b0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
147c0 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
147d0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
147e0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
147f0 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
14800 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
14810 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
14820 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
14830 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
14840 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
14850 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
14860 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
14870 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
14880 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
14890 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
148a0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
148b0 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
148c0 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
148d0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
148e0 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
148f0 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
14900 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
14910 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
14920 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
14930 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
14940 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
14950 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
14960 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
14970 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
14980 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
14990 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
149a0 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
149b0 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
149c0 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
149d0 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
149e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
149f0 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
14a00 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
14a10 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
14a20 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
14a30 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
14a40 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
14a50 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
14a60 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
14a70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
14a80 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
14a90 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
14aa0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
14ab0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
14ac0 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
14ad0 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
14ae0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
14af0 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
14b00 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
14b10 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
14b20 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
14b30 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
14b40 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
14b50 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
14b60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
14b70 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
14b80 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
14b90 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
14ba0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
14bb0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
14bc0 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
14bd0 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
14be0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
14bf0 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
14c00 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14c10 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
14c20 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
14c30 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
14c40 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
14c50 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c70 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
14c80 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
14c90 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
14ca0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
14cb0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
14cc0 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
14cd0 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
14ce0 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
14cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14d00 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14d10 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
14d20 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
14d30 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
14d40 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
14d50 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
14d60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
14d70 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
14d80 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f  R_SHARED );..  /
14d90 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
14da0 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
14db0 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
14dc0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
14dd0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
14de0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
14df0 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
14e00 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
14e10 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
14e20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
14e30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14e40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
14e50 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
14e60 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
14e70 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
14e80 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
14e90 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
14ea0 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
14eb0 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
14ec0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
14ed0 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
14ee0 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
14ef0 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
14f00 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a  bOrigSize;..  /*
14f10 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
14f20 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
14f30 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
14f40 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
14f50 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
14f60 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
14f70 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
14f80 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
14f90 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
14fa0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
14fb0 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
14fc0 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
14fd0 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
14fe0 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
14ff0 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
15000 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
15010 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
15020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
15030 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
15040 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
15050 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
15060 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
15070 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
15080 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
15090 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
150a0 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
150b0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
150c0 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
150d0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
150e0 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
150f0 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
15100 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
15110 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
15120 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
15130 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
15140 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
15150 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
15160 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
15170 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
15180 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
15190 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
151a0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
151b0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
151c0 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
151d0 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
151e0 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
151f0 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
15200 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
15210 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
15220 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
15230 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
15240 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15260 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
15270 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
15280 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
15290 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65  Pager, 1, &pPage
152a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
152b0 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a  , pDone);.    }.
152c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
152d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
152e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
152f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
15300 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
15310 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
15320 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
15330 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
15340 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
15350 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
15360 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
15370 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
15380 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
15390 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
153a0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
153b0 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
153c0 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
153d0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
153e0 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
153f0 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
15400 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
15410 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
15420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15430 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15440 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
15450 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
15460 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15470 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
15480 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
15490 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
154a0 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
154b0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
154c0 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
154d0 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
154e0 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
154f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
15500 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
15510 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
15520 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75  The "pPager->jou
15530 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
15540 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
15550 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15560 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20  ff".    ** test 
15570 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69  is related to ti
15580 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65  cket #2565.  See
15590 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
155a0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  in the.    ** pa
155b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66  ger_playback() f
155c0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  unction for addi
155d0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
155e0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
155f0 73 73 65 72 74 28 20 21 28 6e 4a 52 65 63 3d 3d  ssert( !(nJRec==
15600 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
15610 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
15620 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
15630 70 50 61 67 65 72 29 21 3d 70 50 61 67 65 72 2d  pPager)!=pPager-
15640 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
15650 20 20 20 20 20 26 26 20 28 28 73 7a 4a 20 2d 20       && ((szJ - 
15660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15670 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
15680 5f 53 5a 28 70 50 61 67 65 72 29 29 3e 30 0a 20  _SZ(pPager))>0. 
15690 20 20 20 20 20 20 20 20 26 26 20 70 61 67 65 72          && pager
156a0 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49  NextJournalPageI
156b0 73 56 61 6c 69 64 28 70 50 61 67 65 72 29 29 0a  sValid(pPager)).
156c0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 6e      );.    if( n
156d0 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
156e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
156f0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
15700 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
15710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
15720 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
15730 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
15740 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15750 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
15760 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
15770 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
15780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15790 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
157a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
157b0 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
157c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
157d0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
157e0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
157f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
15800 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d  1, pDone);.    }
15810 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
15820 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
15830 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
15840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
15850 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15860 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f==szJ );..  /* 
15870 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
15880 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
15890 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
158a0 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
158b0 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
158c0 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
158d0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
158e0 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
158f0 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
15900 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
15910 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
15920 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
15930 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
15940 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
15950 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
15960 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15970 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
15980 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76  64 offset = pSav
15990 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
159a0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
159b0 69 7a 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  ize);.    for(ii
159c0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
159d0 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
159e0 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
159f0 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
15a00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15a10 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50  offset==ii*(4+pP
15a20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
15a30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
15a40 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
15a50 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 30 2c  _page(pPager, 0,
15a60 20 26 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f   &offset, 1, pDo
15a70 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
15a80 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15a90 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
15aa0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
15ab0 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
15ac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15ad0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
15ae0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
15af0 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  J;.  }.  return 
15b00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
15b10 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
15b20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
15b30 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
15b40 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
15b50 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
15b60 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
15b70 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
15b80 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
15b90 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
15ba0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
15bb0 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
15bc0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
15bd0 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
15be0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
15bf0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
15c00 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
15c10 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
15c20 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
15c30 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
15c40 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
15c50 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
15c60 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
15c70 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
15c80 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
15c90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
15ca0 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
15cb0 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
15cc0 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
15cd0 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
15ce0 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
15cf0 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
15d00 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
15d10 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
15d20 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
15d30 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
15d40 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
15d50 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
15d60 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
15d70 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
15d80 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
15d90 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
15da0 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
15db0 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
15dc0 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
15dd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
15de0 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
15df0 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
15e00 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
15e10 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
15e20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
15e30 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
15e40 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
15e50 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
15e60 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
15e70 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
15e80 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
15e90 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
15ea0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
15eb0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
15ec0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
15ee0 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
15ef0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
15f00 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
15f10 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
15f20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
15f30 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15f40 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
15f50 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
15f60 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
15f70 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
15f80 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
15f90 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
15fa0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
15fb0 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
15fc0 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
15fd0 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
15ff0 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
16000 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
16010 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
16020 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
16030 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
16040 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
16050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
16060 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
16070 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
16080 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
16090 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
160a0 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
160b0 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
160c0 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
160d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
160e0 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
160f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
16100 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
16110 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
16120 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
16130 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
16140 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
16150 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
16160 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
16170 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
16180 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
16190 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
161a0 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
161b0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
161c0 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c   (bFullFsync?SQL
161d0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
161e0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
161f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
16200 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
16210 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
16220 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16230 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
16240 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
16250 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
16260 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
16270 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
16280 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
16290 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
162a0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
162b0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
162c0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
162d0 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
162e0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
162f0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
16300 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
16310 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
16320 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
16330 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
16340 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16350 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
16360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
16370 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
16380 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
16390 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
163a0 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
163b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
163c0 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
163d0 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
163e0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
163f0 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
16400 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
16410 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
16420 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
16430 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
16440 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
16450 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
16460 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
16470 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
16480 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
16490 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
164a0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
164b0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
164c0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
164d0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
164e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
164f0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
16500 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
16510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
16520 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
16530 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
16540 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
16550 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16560 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
16570 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
16580 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
16590 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
165a0 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
165b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
165c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
165d0 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
165e0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
165f0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
16600 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
16610 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
16620 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
16630 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
16640 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
16650 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
16660 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16670 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
16680 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
16690 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
166a0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
166b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
166c0 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
166d0 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
166e0 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
166f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
16700 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
16710 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
16720 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
16730 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
16740 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
16750 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
16760 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
16770 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
16780 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
16790 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
167a0 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
167b0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
167c0 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
167d0 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
167e0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
167f0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
16800 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
16810 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
16820 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
16830 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
16840 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
16850 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
16860 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
16870 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
16880 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
16890 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
168a0 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
168b0 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
168c0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
168d0 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
168e0 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
16910 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
16920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16950 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
16960 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
16970 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
16980 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
16990 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
169a0 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
169b0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
169c0 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
169d0 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
169e0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
169f0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
16a00 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
16a10 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
16a20 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
16a30 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
16a40 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
16a50 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
16a60 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
16a70 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
16a80 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
16a90 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
16aa0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
16ab0 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
16ac0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
16ad0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
16ae0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16af0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16b00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
16b10 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
16b20 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
16b30 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
16b40 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
16b50 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
16b60 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
16b70 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
16b80 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
16b90 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
16ba0 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
16bb0 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70  dler */.){  .  p
16bc0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
16bd0 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
16be0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
16bf0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
16c00 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
16c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
16c20 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
16c30 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
16c40 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
16c50 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a   reinitializer.*
16c60 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
16c70 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16c80 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  a page in cache 
16c90 69 73 20 6d 6f 64 69 66 69 65 64 20 28 72 65 73  is modified (res
16ca0 74 6f 72 65 64 29 0a 2a 2a 20 61 73 20 70 61 72  tored).** as par
16cb0 74 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  t of a transacti
16cc0 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  on or savepoint 
16cd0 72 6f 6c 6c 62 61 63 6b 2e 20 54 68 65 20 63 61  rollback. The ca
16ce0 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a  llback gives .**
16cf0 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f   higher-level co
16d00 64 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  de an opportunit
16d10 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
16d20 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
16d30 6f 20 0a 2a 2a 20 61 67 72 65 65 20 77 69 74 68  o .** agree with
16d40 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 70 61   the restored pa
16d50 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64  ge data..*/.void
16d60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16d70 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  Reiniter(Pager *
16d80 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
16d90 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
16da0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
16db0 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
16dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
16dd0 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
16de0 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
16df0 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
16e00 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
16e10 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
16e20 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
16e30 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16e40 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
16e50 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
16e60 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
16e70 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
16e80 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
16e90 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
16ea0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
16eb0 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
16ec0 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
16ed0 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
16ee0 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
16ef0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
16f00 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
16f10 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
16f20 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
16f30 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
16f40 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
16f50 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
16f60 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
16f70 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
16f80 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
16f90 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
16fa0 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
16fb0 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
16fc0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
16fd0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
16fe0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
16ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
17000 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
17010 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17020 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
17030 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
17040 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
17050 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
17060 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
17070 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
17080 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
17090 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
170a0 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
170b0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
170c0 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
170d0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
170e0 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
170f0 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
17100 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
17110 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
17120 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
17130 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
17140 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
17150 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
17160 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
17170 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
17180 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
17190 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
171a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
171b0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
171c0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
171d0 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
171e0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
171f0 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
17200 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
17210 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
17220 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
17230 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
17240 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
17250 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
17260 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
17270 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
17280 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
17290 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
172a0 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
172b0 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
172c0 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
172d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
172e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
172f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
17300 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17310 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b  u16 *pPageSize){
17320 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
17330 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69  er->errCode;.  i
17340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17350 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65   ){.    u16 page
17360 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
17370 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
17380 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
17390 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
173a0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
173b0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
173c0 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  );.    if( pageS
173d0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
173e0 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  =pPager->pageSiz
173f0 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  e .     && (pPag
17400 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
17410 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
17420 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  0).     && sqlit
17430 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
17440 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
17450 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )==0 .    ){.   
17460 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
17470 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
17480 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
17490 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
174a0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
174b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
174c0 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
174d0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
174e0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
174f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
17500 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
17510 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17520 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
17530 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
17540 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
17550 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
17560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
17570 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
17580 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
17590 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
175a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
175b0 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  pPageSize = (u16
175c0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
175d0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
175e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
175f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
17600 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
17610 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
17620 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
17630 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
17640 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
17650 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
17660 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
17670 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
17680 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
17690 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
176a0 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
176b0 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
176c0 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
176d0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
176e0 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
176f0 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
17700 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
17710 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
17720 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
17730 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
17740 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
17750 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
17760 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
17770 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
17780 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
17790 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
177a0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
177b0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
177c0 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
177d0 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
177e0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
177f0 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
17800 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
17810 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
17820 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
17830 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
17840 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
17850 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
17860 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
17870 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
17880 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
17890 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
178a0 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
178b0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
178c0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
178d0 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
178e0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
178f0 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
17900 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
17910 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
17920 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
17930 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
17940 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74  Pager, 0);.  ret
17950 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
17960 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
17970 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
17980 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
17990 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
179a0 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
179b0 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
179c0 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
179d0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
179e0 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
179f0 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
17a00 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
17a10 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
17a20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
17a30 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
17a40 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
17a50 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
17a60 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
17a70 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
17a80 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
17a90 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
17aa0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
17ab0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
17ac0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
17ad0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
17ae0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
17af0 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
17b00 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
17b10 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
17b20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
17b30 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
17b40 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
17b50 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
17b60 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
17b70 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
17b80 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
17b90 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
17ba0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
17bb0 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
17bc0 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
17bd0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
17be0 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
17bf0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
17c00 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
17c10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
17c20 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
17c30 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
17c40 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
17c50 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
17c60 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
17c70 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
17c80 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
17c90 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
17ca0 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
17cb0 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
17cc0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
17cd0 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
17ce0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
17cf0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
17d00 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
17d10 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
17d20 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
17d30 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
17d40 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
17d50 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
17d60 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
17d70 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
17d80 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
17d90 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
17da0 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
17db0 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
17dc0 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
17dd0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
17de0 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
17df0 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
17e00 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
17e10 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
17e20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
17e30 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
17e40 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
17e50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
17e60 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
17e70 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
17e80 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
17e90 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
17ea0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
17eb0 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
17ec0 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
17ed0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17ee0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
17ef0 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
17f00 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
17f10 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
17f20 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69  >tempFile );.  i
17f30 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
17f40 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
17f50 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
17f60 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
17f70 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
17f80 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
17f90 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
17fa0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
17fb0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
17fc0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
17fd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
17fe0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
17ff0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18000 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
18010 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
18020 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
18030 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
18040 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61  ted .** with pPa
18050 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  ger. Normally, t
18060 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65  his is calculate
18070 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73  d as (<db file s
18080 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e  ize>/<page-size>
18090 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  )..** However, i
180a0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65  f the file is be
180b0 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67  tween 1 and <pag
180c0 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e  e-size> bytes in
180d0 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   size, then .** 
180e0 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72  this is consider
180f0 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65  ed a 1 page file
18100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
18110 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
18120 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
18130 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
18140 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  led, then the.**
18150 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
18160 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
18170 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
18180 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20  left unchanged. 
18190 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  Or,.** if the fi
181a0 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f  le system has to
181b0 20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20   be queried for 
181c0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
181d0 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  file and.** the 
181e0 71 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65  query attempt re
181f0 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f  turns an IO erro
18200 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  r, the IO error 
18210 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18220 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  .** and *pnPage 
18230 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
18240 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  d..**.** Otherwi
18250 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e  se, if everythin
18260 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
18270 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
18280 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
18290 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65  nd *pnPage is se
182a0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
182b0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
182c0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
182d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
182e0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
182f0 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
18300 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  e){.  Pgno nPage
18310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18320 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
18330 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
18340 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  /..  /* If the p
18350 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20  ager is already 
18360 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
18370 74 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  te, return the e
18380 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20  rror code. */.  
18390 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
183a0 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
183b0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
183c0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  e;.  }..  /* Det
183d0 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65  ermine the numbe
183e0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
183f0 65 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68  e file. Store th
18400 69 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a  is in nPage. */.
18410 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
18420 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20  SizeValid ){.   
18430 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d   nPage = pPager-
18440 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65  >dbSize;.  }else
18450 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18470 20 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20   Error returned 
18480 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  by OsFileSize() 
18490 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  */.    i64 n = 0
184a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
184b0 2a 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62  * File size in b
184c0 79 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  ytes returned by
184d0 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f   OsFileSize() */
184e0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
184f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
18500 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
18510 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
18520 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18530 64 29 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69  d) && (rc = sqli
18540 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
18550 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20 29  ager->fd, &n)) )
18560 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
18570 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
18580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
185a0 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
185b0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
185c0 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20     nPage = 1;.  
185d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
185e0 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20  Page = (Pgno)(n 
185f0 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
18600 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
18610 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18620 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
18630 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18640 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
18650 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
18660 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
18670 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
18680 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b  dbSizeValid = 1;
18690 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
186a0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
186b0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
186c0 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67  in the file is g
186d0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
186e0 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
186f0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
18700 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
18710 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
18720 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
18730 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
18740 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
18750 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
18760 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
18770 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
18780 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
18790 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
187a0 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  ut variable and 
187b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
187c0 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67 65   */.  if( pnPage
187d0 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20   ){.    *pnPage 
187e0 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72  = nPage;.  }.  r
187f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18800 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
18810 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
18820 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
18830 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18840 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
18850 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
18860 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
18870 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
18880 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18890 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
188a0 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
188b0 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
188c0 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
188d0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
188e0 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
188f0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
18900 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
18910 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
18920 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
18930 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
18940 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
18950 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
18960 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
18970 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
18980 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
18990 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
189a0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
189b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
189c0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
189d0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
189e0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
189f0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
18a00 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
18a10 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
18a20 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
18a30 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
18a40 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
18a50 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
18a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18a70 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
18a80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
18a90 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
18aa0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
18ad0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
18ae0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
18af0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
18b00 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
18b10 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
18b20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
18b30 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
18b40 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
18b50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
18b60 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
18b70 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
18b80 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
18b90 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
18ba0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
18bb0 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
18bc0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
18bd0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
18be0 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
18bf0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
18c00 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
18c10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
18c20 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  id==0 );..  /* C
18c30 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
18c40 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
18c50 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
18c60 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
18c70 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
18c80 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ld, or one of th
18c90 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74  e transistions t
18ca0 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
18cb0 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
18cc0 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
18cd0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
18ce0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
18cf0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
18d00 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
18d10 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
18d20 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
18d30 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
18d40 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
18d50 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
18d60 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
18d70 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
18d80 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
18d90 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
18da0 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79  SERVED && lockty
18db0 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  pe==PAGER_EXCLUS
18dc0 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28  IVE).  );..  if(
18dd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18de0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
18df0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
18e10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18e20 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
18e30 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
18e40 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
18e50 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
18e60 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
18e70 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
18e80 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
18e90 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
18ea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18eb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
18ec0 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
18ed0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
18ee0 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
18ef0 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
18f00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18f10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
18f20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18f30 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
18f40 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
18f50 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
18f60 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
18f70 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
18f80 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
18f90 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
18fa0 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
18fb0 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
18fc0 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
18fd0 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
18fe0 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
18ff0 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
19000 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
19010 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
19020 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
19030 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
19040 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76   committed..*/.v
19050 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
19060 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
19070 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19080 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
19090 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
190a0 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73  zeValid );.  ass
190b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
190c0 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
190d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
190e0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
190f0 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67 65  ERVED );.  pPage
19100 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
19110 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20  e;.}.#endif  /* 
19120 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19130 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
19140 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
19150 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
19160 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
19170 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
19180 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
19190 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
191a0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
191b0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
191c0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
191d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
191e0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
191f0 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
19200 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
19210 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
19220 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
19230 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
19240 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
19250 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
19260 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
19270 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
19280 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
19290 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
192a0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
192b0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
192c0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
192d0 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
192e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
192f0 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
19300 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
19310 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
19320 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
19330 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
19340 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
19350 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
19360 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
19370 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
19380 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
19390 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
193a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
193b0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
193c0 65 72 29 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73  er){.  disable_s
193d0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
193e0 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
193f0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
19400 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  ();.  pPager->er
19410 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61  rCode = 0;.  pPa
19420 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
19430 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f  de = 0;.  pager_
19440 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
19450 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
19460 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
19470 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
19480 0a 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65  .    /* Set Page
19490 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  r.journalHdr to 
194a0 2d 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66  -1 for the benef
194b0 69 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f  it of the pager_
194c0 70 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20  playback() .    
194d0 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61  ** call which ma
194e0 79 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77  y be made from w
194f0 69 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63  ithin pagerUnloc
19500 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  kAndRollback(). 
19510 49 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  If it.    ** is 
19520 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65  not -1, then the
19530 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
19540 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75  n of an open jou
19550 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20  rnal file may.  
19560 20 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62    ** be played b
19570 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
19580 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65  abase. If a powe
19590 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
195a0 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
195b0 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
195c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
195d0 79 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  y become corrupt
195e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
195f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
19600 3d 20 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55  = -1;.    pagerU
19610 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
19620 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
19630 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
19640 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
19650 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
19660 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
19670 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
19680 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
19690 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
196a0 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
196b0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
196c0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
196d0 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
196e0 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
196f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
19700 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
19710 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
19720 63 68 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  che);..  assert(
19730 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
19740 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
19750 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
19760 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
19770 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
19780 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
19790 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
197a0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
197b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
197c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
197d0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
197e0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
197f0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
19800 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
19810 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
19820 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
19830 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
19840 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
19850 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
19860 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
19870 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
19880 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
19890 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
198a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
198b0 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
198c0 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
198d0 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
198e0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
198f0 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
19900 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
19910 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
19920 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
19930 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
19940 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
19950 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
19960 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
19970 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
19980 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
19990 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
199a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
199b0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
199c0 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
199d0 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73  nc flag is not s
199e0 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
199f0 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e  nction is a.** n
19a00 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
19a10 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
19a20 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
19a30 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
19a40 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69  .** and the devi
19a50 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
19a60 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66 69  cs of the the fi
19a70 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
19a80 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
19a90 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
19aa0 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
19ab0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
19ac0 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
19ad0 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
19ae0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
19af0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
19b00 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
19b10 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
19b20 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
19b30 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
19b40 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
19b50 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
19b60 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
19b70 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
19b80 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
19b90 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
19ba0 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
19bb0 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
19bc0 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
19bd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
19be0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
19bf0 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
19c00 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
19c10 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
19c20 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
19c30 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
19c40 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
19c50 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
19c60 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
19c70 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
19c80 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
19c90 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
19ca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19cb0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
19cc0 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
19cd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
19ce0 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
19cf0 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
19d00 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
19d10 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
19d20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
19d30 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
19d40 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
19d50 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
19d60 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
19d70 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
19d80 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
19d90 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
19da0 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
19db0 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e  *.** The Pager.n
19dc0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
19dd0 6e 65 76 65 72 20 62 65 20 73 65 74 20 66 6f 72  never be set for
19de0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19df0 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65  , or any.** file
19e00 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f   operating in no
19e10 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65  -sync mode (Page
19e20 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20  r.noSync set to 
19e30 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a  non-zero)..**.**
19e40 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19e50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  this routine cle
19e60 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ars the PGHDR_NE
19e70 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20  ED_SYNC flag of 
19e80 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63  every .** page c
19e90 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e  urrently held in
19ea0 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72   memory before r
19eb0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
19ec0 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20  OK. If an IO.** 
19ed0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
19ee0 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49  ered, then the I
19ef0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
19f00 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
19f10 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
19f20 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
19f30 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
19f40 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
19f50 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
19f60 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
19f70 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
19f80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
19f90 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
19fa0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
19fb0 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY ){.      int 
19fc0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
19ff0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  */.      const i
1a000 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
1a010 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1a020 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1a030 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
1a040 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1a050 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
1a060 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
1a070 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1a080 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
1a090 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    /* Variable iN
1a0a0 52 65 63 4f 66 66 73 65 74 20 69 73 20 73 65 74  RecOffset is set
1a0b0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69   to the offset i
1a0c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1a0d0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  le.        ** of
1a0e0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
1a0f0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
1a100 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
1a110 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
1a120 20 20 20 20 20 2a 2a 20 54 68 69 73 20 66 69 65       ** This fie
1a130 6c 64 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74  ld will be updat
1a140 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ed following the
1a150 20 78 53 79 6e 63 28 29 20 6f 70 65 72 61 74 69   xSync() operati
1a160 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  on.        ** on
1a170 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a180 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36  e. */.        i6
1a190 34 20 69 4e 52 65 63 4f 66 66 73 65 74 20 3d 20  4 iNRecOffset = 
1a1a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1a1b0 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
1a1c0 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 0a 20 20 20  rnalMagic);..   
1a1d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
1a1e0 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
1a1f0 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
1a200 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
1a210 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
1a220 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
1a230 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
1a240 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
1a250 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
1a260 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
1a270 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
1a280 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
1a290 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
1a2a0 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
1a2b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
1a2c0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
1a2d0 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
1a2e0 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
1a2f0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1a300 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
1a310 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
1a320 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
1a330 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
1a340 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
1a350 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ous connections 
1a360 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
1a370 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
1a380 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
1a390 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
1a3a0 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
1a3b0 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
1a3c0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1a3d0 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
1a3e0 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
1a3f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1a400 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
1a410 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
1a420 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1a430 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
1a440 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
1a450 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
1a460 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
1a470 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
1a480 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
1a490 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
1a4a0 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
1a4b0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
1a4c0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
1a4d0 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
1a4e0 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
1a4f0 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
1a500 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
1a510 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
1a520 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
1a530 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
1a540 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1a550 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
1a560 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
1a570 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
1a580 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
1a590 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
1a5a0 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
1a5b0 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
1a5c0 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
1a5d0 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
1a5e0 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
1a5f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
1a600 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
1a610 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
1a620 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
1a630 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
1a640 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
1a650 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1a660 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
1a670 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
1a680 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
1a690 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
1a6a0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
1a6b0 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
1a6c0 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
1a6d0 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
1a6e0 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
1a6f0 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
1a700 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
1a710 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
1a720 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
1a730 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1a740 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
1a750 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48  ffset = journalH
1a760 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
1a770 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1a780 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
1a790 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1a7a0 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
1a7b0 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
1a7c0 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
1a7d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a7e0 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
1a7f0 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
1a800 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
1a810 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
1a820 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
1a830 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
1a840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a850 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
1a860 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
1a870 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
1a880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a890 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a8a0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
1a8b0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1a8c0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1a8d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a8e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1a8f0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
1a900 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
1a910 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
1a920 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
1a930 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
1a940 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
1a950 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
1a960 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
1a970 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
1a980 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
1a990 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
1a9a0 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
1a9b0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
1a9c0 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
1a9d0 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
1a9e0 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
1a9f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1aa00 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
1aa10 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
1aa20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
1aa30 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
1aa40 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
1aa50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
1aa60 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
1aa70 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
1aa80 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
1aa90 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
1aaa0 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
1aab0 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
1aac0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
1aad0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
1aae0 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
1aaf0 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
1ab00 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1ab10 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
1ab20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
1ab30 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
1ab40 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
1ab50 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1ab60 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
1ab70 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
1ab80 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
1ab90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
1aba0 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
1abb0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
1abc0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1abd0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
1abe0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
1abf0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
1ac00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ac10 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1ac20 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
1ac30 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
1ac40 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1ac50 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1ac60 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1ac70 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1ac80 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
1ac90 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 69 4e  d\n", pPager, iN
1aca0 52 65 63 4f 66 66 73 65 74 2c 20 34 29 29 3b 0a  RecOffset, 4));.
1acb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
1acc0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1acd0 3e 6a 66 64 2c 20 69 4e 52 65 63 4f 66 66 73 65  >jfd, iNRecOffse
1ace0 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  t, pPager->nRec)
1acf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1ad00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1ad10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1ad20 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1ad30 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1ad40 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1ad50 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1ad60 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1ad70 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1ad80 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1ad90 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1ada0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1adb0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
1adc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1add0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1ade0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1adf0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
1ae00 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1ae10 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1ae20 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
1ae30 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
1ae40 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1ae50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ae60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1ae70 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1ae80 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
1ae90 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63  ile was just suc
1aea0 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
1aeb0 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64  . Set Pager.need
1aec0 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20  Sync .    ** to 
1aed0 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74  zero and clear t
1aee0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1aef0 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70  NC flag on all p
1af00 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  agess..    */.  
1af10 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1af20 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
1af30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1af40 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  ed = 1;.    sqli
1af50 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
1af60 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
1af70 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20  pPCache);.  }.. 
1af80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1af90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1afa0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1afb0 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
1afc0 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
1afd0 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
1afe0 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
1aff0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
1b000 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
1b010 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
1b020 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
1b030 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
1b040 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
1b050 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
1b060 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
1b070 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
1b080 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
1b090 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
1b0a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1b0b0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
1b0c0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
1b0d0 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
1b0e0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1b0f0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1b100 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
1b110 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
1b120 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
1b130 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
1b140 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
1b150 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
1b160 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
1b170 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
1b180 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
1b190 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1b1a0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
1b1b0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1b1c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b1d0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
1b1e0 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
1b1f0 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
1b200 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
1b210 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
1b220 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
1b230 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
1b240 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
1b250 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
1b260 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
1b270 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
1b280 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
1b290 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
1b2a0 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
1b2b0 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
1b2c0 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
1b2d0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
1b2e0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
1b2f0 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
1b300 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
1b310 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
1b320 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
1b330 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
1b340 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
1b350 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1b360 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b370 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
1b380 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
1b390 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
1b3a0 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
1b3b0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
1b3c0 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
1b3d0 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
1b3e0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1b3f0 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
1b400 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
1b410 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
1b420 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
1b430 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
1b440 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
1b450 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
1b460 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
1b470 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
1b480 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
1b490 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
1b4a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1b4b0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
1b4c0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
1b4d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1b4e0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
1b4f0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1b500 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
1b510 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
1b520 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
1b530 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
1b540 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
1b550 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1b560 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1b570 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
1b580 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
1b590 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
1b5a0 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20  r *pPager;      
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5c0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1b5d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b600 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
1b610 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1b620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b630 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
1b640 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
1b650 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
1b660 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
1b670 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
1b680 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1b690 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
1b6a0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
1b6b0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
1b6c0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1b6d0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
1b6e0 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20 6e    ** call is a n
1b6f0 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o-op..  **.  ** 
1b700 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
1b710 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
1b720 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
1b730 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
1b740 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
1b750 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
1b760 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
1b770 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
1b780 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
1b790 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
1b7a0 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
1b7b0 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
1b7c0 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
1b7d0 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
1b7e0 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
1b7f0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
1b800 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
1b810 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
1b820 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
1b830 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
1b840 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
1b850 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
1b860 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
1b870 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
1b880 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
1b890 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
1b8a0 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
1b8b0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
1b8c0 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
1b8d0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1b8e0 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
1b8f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
1b900 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1b910 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
1b920 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
1b930 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
1b940 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
1b950 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
1b960 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
1b970 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
1b980 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
1b990 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
1b9a0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  back..  */.  ass
1b9b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1b9c0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1b9d0 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ED );.  rc = pag
1b9e0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1b9f0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
1ba00 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49  E_LOCK);..  /* I
1ba10 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
1ba20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
1ba30 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
1ba40 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
1ba50 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
1ba60 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
1ba70 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
1ba80 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
1ba90 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
1baa0 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
1bab0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
1bac0 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
1bad0 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
1bae0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
1baf0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1bb00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1bb10 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
1bb20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1bb30 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
1bb40 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
1bb50 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
1bb60 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
1bb70 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1bb80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
1bb90 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
1bba0 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
1bbb0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1bbc0 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
1bbd0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
1bbe0 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
1bbf0 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
1bc00 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1bc10 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
1bc20 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
1bc30 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
1bc40 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
1bc50 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
1bc60 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
1bc70 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
1bc80 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
1bc90 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
1bca0 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
1bcb0 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
1bcc0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
1bcd0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
1bce0 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
1bcf0 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
1bd00 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
1bd10 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
1bd20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1bd30 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
1bd40 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
1bd50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
1bd60 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
1bd70 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
1bd80 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
1bd90 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
1bda0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1bdb0 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
1bdc0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77    /* Offset to w
1bdd0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68  rite */.      ch
1bde0 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45  ar *pData = CODE
1bdf0 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
1be00 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
1be10 29 3b 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72  ); /* Data to wr
1be20 69 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ite */..      /*
1be30 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
1be40 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
1be50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1be60 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1be70 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
1be80 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
1be90 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
1bea0 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
1beb0 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
1bec0 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
1bed0 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
1bee0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
1bef0 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
1bf00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1bf10 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
1bf20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
1bf30 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
1bf40 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
1bf50 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
1bf60 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
1bf70 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
1bf80 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1bf90 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1bfa0 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
1bfb0 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
1bfc0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1bfd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1bfe0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
1bff0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
1c000 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
1c010 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
1c020 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 50        }..      P
1c030 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
1c040 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
1c050 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1c070 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c080 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1c090 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
1c0a0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
1c0b0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
1c0c0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1c0d0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1c0e0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
1c0f0 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
1c100 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1c110 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
1c120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c130 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
1c140 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
1c150 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c160 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
1c170 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1c180 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1c190 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
1c1a0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1c1b0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
1c1c0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
1c1d0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
1c1e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1c1f0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1c200 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
1c210 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1c220 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
1c230 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
1c240 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
1c250 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
1c260 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
1c270 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
1c280 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
1c290 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
1c2a0 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
1c2b0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1c2c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1c2d0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
1c2e0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
1c2f0 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
1c300 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
1c310 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
1c320 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
1c330 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1c340 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1c350 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
1c360 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1c370 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
1c380 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
1c390 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
1c3a0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1c3b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
1c3c0 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
1c3d0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
1c3e0 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
1c3f0 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
1c400 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
1c410 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
1c420 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
1c430 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
1c440 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69  .  int rc;.  voi
1c450 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
1c460 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a  pData;.  Pager *
1c470 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c480 61 67 65 72 3b 0a 20 20 69 36 34 20 6f 66 66 73  ager;.  i64 offs
1c490 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75  et = pPager->nSu
1c4a0 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
1c4b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 63 68 61  pageSize);.  cha
1c4c0 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
1c4d0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1c4e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1c4f0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
1c500 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1c510 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1c520 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1c530 67 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 61 73  g->pgno));..  as
1c540 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
1c550 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
1c560 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1c570 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 72 63  OrigSize );.  rc
1c580 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
1c590 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
1c5a0 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
1c5b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c5c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1c5d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1c5e0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
1c5f0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
1c600 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
1c610 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c630 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
1c640 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
1c650 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
1c660 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
1c670 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
1c680 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
1c690 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c6a0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1c6b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1c6c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1c6d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c6e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
1c6f0 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
1c700 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
1c710 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
1c720 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
1c730 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1c740 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
1c750 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
1c760 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
1c770 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
1c780 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
1c790 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
1c7a0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
1c7b0 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
1c7c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1c7d0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
1c7e0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
1c7f0 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
1c800 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
1c810 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1c820 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
1c830 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
1c840 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
1c850 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
1c860 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1c870 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
1c880 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
1c890 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c8a0 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
1c8b0 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
1c8c0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
1c8d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1c8e0 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
1c8f0 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
1c900 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
1c910 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1c920 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
1c930 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
1c940 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
1c950 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
1c960 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
1c970 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1c980 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1c990 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
1c9a0 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
1c9b0 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
1c9c0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
1c9d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
1c9e0 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
1c9f0 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
1ca00 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
1ca10 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
1ca20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1ca30 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
1ca40 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
1ca50 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
1ca60 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
1ca70 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
1ca80 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
1ca90 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
1caa0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1cab0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1cac0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
1cad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1cae0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
1caf0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
1cb00 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
1cb10 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
1cb20 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
1cb30 74 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  tSync flag is se
1cb40 74 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  t by the sqlite3
1cb50 50 61 67 65 72 57 72 69 74 65 28 29 20 66 75 6e  PagerWrite() fun
1cb60 63 74 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20  ction while it. 
1cb70 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69   ** is journalli
1cb80 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20  ng a set of two 
1cb90 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65  or more database
1cba0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
1cbb0 73 74 6f 72 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  stored.  ** on t
1cbc0 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65 63  he same disk sec
1cbd0 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74 68 65  tor. Syncing the
1cbe0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
1cbf0 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20 20  allowed while.  
1cc00 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
1cc10 6e 69 6e 67 20 61 73 20 69 74 20 69 73 20 69 6d  ning as it is im
1cc20 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
1cc30 20 6d 65 6d 62 65 72 73 20 6f 66 20 73 75 63 68   members of such
1cc40 20 61 0a 20 20 2a 2a 20 73 65 74 20 6f 66 20 70   a.  ** set of p
1cc50 61 67 65 73 20 61 72 65 20 73 79 6e 63 65 64 20  ages are synced 
1cc60 74 6f 20 64 69 73 6b 20 74 6f 67 65 74 68 65 72  to disk together
1cc70 2e 20 53 6f 2c 20 69 66 20 74 68 65 20 70 61 67  . So, if the pag
1cc80 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  e this function.
1cc90 20 20 2a 2a 20 69 73 20 74 72 79 69 6e 67 20 74    ** is trying t
1cca0 6f 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c  o make clean wil
1ccb0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1ccc0 6e 61 6c 20 73 79 6e 63 20 61 6e 64 20 74 68 65  nal sync and the
1ccd0 20 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 2a 2a 20   doNotSync.  ** 
1cce0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 72 65 74  flag is set, ret
1ccf0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1cd00 67 20 61 6e 79 74 68 69 6e 67 2e 20 54 68 65 20  g anything. The 
1cd10 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 69 6c  pcache layer wil
1cd20 6c 0a 20 20 2a 2a 20 6a 75 73 74 20 68 61 76 65  l.  ** just have
1cd30 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
1cd40 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1cd50 70 61 67 65 20 62 75 66 66 65 72 20 69 6e 73 74  page buffer inst
1cd60 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 75 73  ead of.  ** reus
1cd70 69 6e 67 20 70 50 67 2e 0a 20 20 2a 2a 0a 20 20  ing pPg..  **.  
1cd80 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66  ** Similarly, if
1cd90 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
1cda0 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
1cdb0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
1cdc0 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 74 72 79 20  do not.  ** try 
1cdd0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e  to write the con
1cde0 74 65 6e 74 73 20 6f 66 20 70 50 67 20 74 6f 20  tents of pPg to 
1cdf0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
1ce00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ce10 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e   || (pPager->doN
1ce20 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66  otSync && pPg->f
1ce30 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1ce40 53 59 4e 43 29 20 29 7b 0a 20 20 20 20 72 65 74  SYNC) ){.    ret
1ce50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ce60 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68   }..  /* Sync th
1ce70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1ce80 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
1ce90 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
1cea0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1ceb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63  ){.    rc = sync
1cec0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1ced0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cee0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1cef0 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20  ->fullSync && . 
1cf00 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a       !(pPager->j
1cf10 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1cf20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
1cf30 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 21  MORY) &&.      !
1cf40 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
1cf50 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1cf60 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
1cf70 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1cf80 50 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20 20 20  PEND).    ){.   
1cf90 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
1cfa0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1cfb0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1cfc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1cfd0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1cfe0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1cff0 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67  his page is larg
1d000 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1d010 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  ent size of.  **
1d020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d030 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
1d040 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
1d050 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1d060 6c 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  l..  ** This is 
1d070 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
1d080 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
1d090 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
1d0a0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61   will not.  ** a
1d0b0 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61  ctually write da
1d0c0 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69  ta to the file i
1d0d0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
1d0e0 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20  *.  ** Consider 
1d0f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
1d100 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73  quence of events
1d110 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45  :.  **.  **   BE
1d120 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a  GIN;.  **     <j
1d130 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20  ournal page X>. 
1d140 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
1d150 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20  page X>.  **    
1d160 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
1d170 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e   **       <shrin
1d180 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
1d190 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 2a 2a  to Y pages>.  **
1d1a0 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
1d1b0 73 73 28 70 61 67 65 20 58 29 0a 20 20 2a 2a 20  ss(page X).  ** 
1d1c0 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
1d1d0 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  sp;.  **.  ** If
1d1e0 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
1d1f0 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
1d200 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
1d210 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
1d220 65 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74  en.  ** out to t
1d230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d240 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72  , but will be dr
1d250 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  opped from the c
1d260 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a  ache. Then,.  **
1d270 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
1d280 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
1d290 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
1d2a0 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
1d2b0 65 61 64 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ead.  ** data fr
1d2c0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1d2d0 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
1d2e0 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
1d2f0 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 2a 2a  age X as it.  **
1d300 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72   was when the tr
1d310 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1d320 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73  d, not as it was
1d330 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54   when "SAVEPOINT
1d340 20 73 70 22 0a 20 20 2a 2a 20 77 61 73 20 65 78   sp".  ** was ex
1d350 65 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  ecuted..  **.  *
1d360 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
1d370 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  s to write the c
1d380 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20  urrent data for 
1d390 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20  page X into the 
1d3a0 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  .  ** sub-journa
1d3b0 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
1d3c0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1d3d0 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
1d3e0 20 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65   it will.  ** be
1d3f0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1d400 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77   current value w
1d410 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
1d420 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 2a  K TO sp" is .  *
1d430 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f  * executed..  */
1d440 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d450 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e  E_OK && pPg->pgn
1d460 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
1d470 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
1d480 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
1d490 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
1d4a0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  Page(pPg);.  }..
1d4b0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
1d4c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
1d4d0 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
1d4e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1d4f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 67 2d  E_OK ){.    pPg-
1d510 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
1d520 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1d530 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1d540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
1d550 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1d560 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
1d570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d580 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
1d590 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
1d5a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1d5b0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
1d5c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
1d5d0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
1d5e0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1d5f0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1d600 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a  ger, rc);.}.../*
1d610 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
1d620 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
1d630 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
1d640 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
1d650 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
1d660 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
1d670 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
1d680 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
1d690 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
1d6a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
1d6b0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
1d6c0 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
1d6d0 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
1d6e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d6f0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
1d700 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
1d710 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
1d720 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
1d730 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
1d740 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
1d750 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
1d760 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
1d770 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
1d780 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
1d790 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
1d7a0 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
1d7b0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
1d7c0 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
1d7d0 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
1d7e0 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
1d7f0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
1d800 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
1d810 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
1d820 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
1d830 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
1d840 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
1d850 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
1d860 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
1d870 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1d880 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
1d890 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
1d8a0 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
1d8b0 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
1d8c0 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
1d8d0 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
1d8e0 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
1d8f0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
1d900 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
1d910 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
1d920 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
1d930 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
1d940 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
1d950 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
1d960 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
1d970 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
1d980 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
1d990 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
1d9a0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
1d9b0 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52  L and PAGER_NO_R
1d9c0 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a  EADLOCK flags..*
1d9d0 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
1d9e0 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
1d9f0 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
1da00 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
1da10 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
1da20 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
1da30 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
1da40 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
1da50 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
1da60 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
1da70 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
1da80 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
1da90 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
1daa0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
1dab0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1dac0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
1dad0 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
1dae0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
1daf0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
1db00 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1db10 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
1db20 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
1db30 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
1db40 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
1db50 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
1db60 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
1db70 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
1db80 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
1db90 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
1dba0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
1dbb0 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
1dbc0 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
1dbd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1dbe0 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
1dbf0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1dc00 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
1dc10 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
1dc20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
1dc30 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
1dc40 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
1dc50 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
1dc60 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
1dc70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1dc80 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
1dc90 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1dca0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
1dcb0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dcd0 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
1dce0 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
1dcf0 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
1dd00 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
1dd10 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
1dd20 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
1dd30 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
1dd40 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
1dd50 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
1dd60 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
1dd70 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
1dd80 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  en() */.){.  u8 
1dd90 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
1dda0 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
1ddb0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1ddc0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
1ddd0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
1dde0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ddf0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
1de00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
1de10 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
1de20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
1de30 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
1de40 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
1de50 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
1de60 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
1de70 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1de80 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1de90 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
1dea0 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
1deb0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1dec0 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
1ded0 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
1dee0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1def0 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
1df00 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
1df10 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
1df20 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
1df30 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
1df40 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
1df50 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1df60 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
1df70 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
1df80 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
1df90 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
1dfa0 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
1dfb0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
1dfc0 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
1dfd0 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
1dfe0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
1dff0 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
1e000 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
1e010 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20  _READLOCK)!=0;  
1e020 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
1e030 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69  read-lock */.  i
1e040 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
1e050 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
1e060 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
1e070 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
1e080 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
1e090 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u16 szPageDflt =
1e0a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1e0b0 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
1e0c0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1e0d0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
1e0e0 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
1e0f0 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
1e100 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
1e110 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
1e120 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
1e130 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
1e140 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
1e150 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
1e160 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
1e170 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
1e180 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
1e190 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1e1a0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
1e1b0 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
1e1c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
1e1d0 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
1e1e0 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
1e1f0 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
1e200 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
1e210 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
1e220 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
1e230 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
1e240 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
1e250 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
1e260 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
1e270 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
1e280 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
1e290 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
1e2a0 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
1e2b0 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
1e2c0 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
1e2d0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
1e2e0 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
1e2f0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c  alFileSize = sql
1e300 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
1e310 70 56 66 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pVfs);.  }else{.
1e320 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
1e330 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  ize = sqlite3Mem
1e340 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 3b 0a 20  JournalSize();. 
1e350 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1e360 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1e370 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
1e380 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e390 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
1e3a0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
1e3b0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
1e3c0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
1e3d0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
1e3e0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
1e3f0 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
1e400 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
1e410 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
1e420 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
1e430 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
1e440 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
1e450 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
1e460 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
1e470 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
1e480 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
1e490 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
1e4a0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1e4b0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
1e4c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
1e4d0 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
1e4e0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
1e4f0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
1e500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1e510 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  EM;.    }.#ifnde
1e520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
1e530 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
1e540 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
1e550 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
1e560 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
1e570 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
1e580 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
1e590 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
1e5a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1e5b0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
1e5c0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
1e5d0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
1e5e0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
1e5f0 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ..    nPathname 
1e600 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1e610 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
1e620 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e630 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
1e640 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
1e650 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
1e660 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
1e670 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
1e680 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
1e690 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
1e6a0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
1e6b0 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
1e6c0 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
1e6d0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
1e6e0 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
1e6f0 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
1e700 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
1e710 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
1e720 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
1e730 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
1e740 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
1e750 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
1e760 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
1e770 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
1e780 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
1e790 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
1e7a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e7b0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
1e7c0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1e7d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e7e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1e7f0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
1e800 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1e810 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
1e820 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
1e830 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1e840 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
1e850 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
1e860 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1e870 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
1e880 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
1e890 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
1e8a0 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
1e8b0 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
1e8c0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1e8d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
1e8e0 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1e900 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
1e910 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
1e920 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1e940 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
1e950 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
1e960 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
1e970 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
1e980 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
1e990 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
1e9a0 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
1e9b0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
1e9c0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
1e9d0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
1e9e0 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
1e9f0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
1ea00 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
1ea10 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
1ea20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
1ea30 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
1ea40 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
1ea50 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1ea60 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
1ea70 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
1ea80 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
1ea90 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
1eaa0 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
1eab0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
1eac0 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72    sizeof(*pPager
1ead0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
1eae0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1eaf0 20 2a 2f 0a 20 20 20 20 70 63 61 63 68 65 53 69   */.    pcacheSi
1eb00 7a 65 20 20 20 20 20 20 2b 20 20 20 20 20 20 20  ze      +       
1eb10 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
1eb20 6a 65 63 74 20 2a 2f 0a 20 20 20 20 70 56 66 73  ject */.    pVfs
1eb30 2d 3e 73 7a 4f 73 46 69 6c 65 20 20 2b 20 20 20  ->szOsFile  +   
1eb40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
1eb50 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
1eb60 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1eb70 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 2f  ze * 2 +       /
1eb80 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
1eb90 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
1eba0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1ebc0 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Filename */.    
1ebd0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20  nPathname + 8 + 
1ebe0 31 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a  1           /* z
1ebf0 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
1ec00 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
1ec10 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ec20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1ec30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1ec40 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
1ec50 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
1ec60 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
1ec70 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
1ec80 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
1ec90 29 28 70 50 74 72 20 2b 3d 20 73 69 7a 65 6f 66  )(pPtr += sizeof
1eca0 28 2a 70 50 61 67 65 72 29 29 3b 0a 20 20 70 50  (*pPager));.  pP
1ecb0 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
1ecc0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
1ecd0 72 20 2b 3d 20 70 63 61 63 68 65 53 69 7a 65 29  r += pcacheSize)
1ece0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
1ecf0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
1ed00 2a 29 28 70 50 74 72 20 2b 3d 20 70 56 66 73 2d  *)(pPtr += pVfs-
1ed10 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 70 50  >szOsFile);.  pP
1ed20 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
1ed30 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
1ed40 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
1ed50 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
1ed60 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
1ed70 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
1ed80 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
1ed90 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
1eda0 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
1edb0 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
1edc0 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
1edd0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
1ede0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
1edf0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  ){.    pPager->z
1ee00 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
1ee10 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
1ee20 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20  hname + 1);.    
1ee30 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
1ee40 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
1ee50 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
1ee60 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
1ee70 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
1ee80 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
1ee90 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
1eea0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
1eeb0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
1eec0 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20  journal", 8);.  
1eed0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1eee0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
1eef0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
1ef00 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
1ef10 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
1ef20 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
1ef30 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
1ef40 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1ef50 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1ef60 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
1ef70 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
1ef80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ef90 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
1efa0 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
1efb0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
1efc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1efd0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
1efe0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
1eff0 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
1f000 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61   &fout);.    rea
1f010 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
1f020 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1f030 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
1f040 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
1f050 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
1f060 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
1f070 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
1f080 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
1f090 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
1f0a0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
1f0b0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1f0c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1f0d0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
1f0e0 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
1f0f0 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
1f100 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
1f110 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f120 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
1f130 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
1f140 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
1f150 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
1f160 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
1f170 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
1f180 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
1f190 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
1f1a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1f1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
1f1c0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
1f1d0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1f1e0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
1f1f0 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
1f200 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
1f210 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f220 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
1f230 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
1f240 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
1f250 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
1f260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
1f270 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
1f280 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f290 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
1f2a0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
1f2b0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f2c0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
1f2d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f2e0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
1f2f0 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
1f300 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
1f310 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
1f320 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f330 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
1f340 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1f350 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1f360 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1f370 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1f380 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
1f390 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
1f3a0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
1f3b0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
1f3c0 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
1f3d0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
1f3e0 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
1f3f0 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
1f400 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
1f410 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
1f420 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
1f430 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
1f440 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
1f450 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f460 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
1f470 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
1f480 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
1f490 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
1f4a0 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
1f4b0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1f4c0 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
1f4d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1f4e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1f4f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1f500 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
1f510 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
1f520 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
1f530 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
1f540 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
1f550 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
1f560 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
1f570 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
1f580 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
1f590 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
1f5a0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
1f5b0 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
1f5c0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
1f5d0 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
1f5e0 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
1f5f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1f600 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
1f610 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
1f620 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
1f630 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
1f640 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
1f650 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
1f660 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
1f670 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
1f680 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
1f690 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
1f6a0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
1f6b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1f6c0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
1f6d0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1f6e0 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
1f6f0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
1f700 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
1f710 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
1f720 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
1f730 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
1f740 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
1f750 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
1f760 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1f770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1f780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
1f790 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
1f7a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
1f7b0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
1f7c0 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a  , &szPageDflt);.
1f7d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1f7e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1f7f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
1f800 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
1f810 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
1f820 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65  ocks above, free
1f830 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
1f840 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
1f850 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20  lose the file.. 
1f860 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51   */.  if( rc!=SQ
1f870 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1f880 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1f890 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20  pTmpSpace );.   
1f8a0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1f8b0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1f8c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
1f8d0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
1f8e0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
1f8f0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
1f900 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
1f910 0a 20 20 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  .  nExtra = FORC
1f920 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
1f930 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ra);.  sqlite3Pc
1f940 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44  acheOpen(szPageD
1f950 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65  flt, nExtra, !me
1f960 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mDb,.           
1f970 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
1f980 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
1f990 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
1f9a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1f9b0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
1f9c0 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
1f9d0 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
1f9e0 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
1f9f0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  ->zFilename));. 
1fa00 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
1fa10 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
1fa20 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
1fa30 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d  ame))..  pPager-
1fa40 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  >useJournal = (u
1fa50 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  8)useJournal;.  
1fa60 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1fa70 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b  ck = (noReadlock
1fa80 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31   && readOnly) ?1
1fa90 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  :0;.  /* pPager-
1faa0 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
1fab0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
1fac0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
1fad0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
1fae0 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
1faf0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1fb00 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
1fb10 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
1fb20 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
1fb30 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
1fb40 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
1fb50 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
1fb60 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
1fb70 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
1fb80 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
1fb90 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
1fba0 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
1fbb0 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  K; */.  assert( 
1fbc0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d  pPager->state ==
1fbd0 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47   (tempFile ? PAG
1fbe0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50  ER_EXCLUSIVE : P
1fbf0 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a  AGER_UNLOCK) );.
1fc00 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
1fc10 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
1fc20 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1fc30 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
1fc40 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
1fc50 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
1fc60 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
1fc70 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
1fc80 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
1fc90 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
1fca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
1fcb0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
1fcc0 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
1fcd0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
1fce0 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
1fcf0 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
1fd00 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1fd10 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
1fd20 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
1fd30 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
1fd40 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
1fd50 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
1fd60 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
1fd70 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
1fd80 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
1fd90 6f 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  oSync = (pPager-
1fda0 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73  >tempFile || !us
1fdb0 65 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a  eJournal) ?1:0;.
1fdc0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
1fdd0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
1fde0 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
1fdf0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
1fe00 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1fe10 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
1fe20 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
1fe30 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
1fe40 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
1fe50 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
1fe60 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
1fe70 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
1fe80 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65   nExtra;.  pPage
1fe90 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
1fea0 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
1feb0 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
1fec0 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
1fed0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1fee0 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
1fef0 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
1ff00 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1ff10 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
1ff20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ff30 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
1ff40 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
1ff50 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
1ff60 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
1ff70 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
1ff80 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
1ff90 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Arg = 0; */.  /*
1ffa0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1ffb0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
1ffc0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
1ffd0 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
1ffe0 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
1fff0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20000 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
20010 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20020 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
20030 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
20040 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
20050 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
20060 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
20070 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
20080 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
20090 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
200a0 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
200b0 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
200c0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
200d0 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
200e0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
200f0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
20100 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
20110 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
20120 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
20130 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63 72  llowing three cr
20140 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
20150 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
20160 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
20170 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
20180 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
20190 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
201a0 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
201b0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
201c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
201d0 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
201e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
201f0 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
20200 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
20210 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
20220 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
20230 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20240 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
20250 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
20260 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
20270 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
20280 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
20290 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
202a0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
202b0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
202c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
202d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
202e0 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
202f0 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
20300 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
20310 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
20320 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
20330 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
20340 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
20350 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
20360 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  l file to examin
20370 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e its.** content
20380 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f  .  Hence, the jo
20390 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
203a0 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ain the name of 
203b0 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  a master.** jour
203c0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61  nal file that ha
203d0 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
203e0 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65  and hence not be
203f0 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65   hot.  Or.** the
20400 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
20410 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20  ournal might be 
20420 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69  zeroed out.  Thi
20430 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65  s routine.** doe
20440 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74  s not discover t
20450 68 65 73 65 20 63 61 73 65 73 20 6f 66 20 61 20  hese cases of a 
20460 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  non-hot journal 
20470 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  - if the.** jour
20480 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
20490 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  and is not empty
204a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   this routine as
204b0 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68  sumes it.** is h
204c0 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70  ot.  The pager_p
204d0 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
204e0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
204f0 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  that the.** jour
20500 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
20510 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77  really hot and w
20520 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  ill no-op..**.**
20530 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
20540 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
20550 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
20560 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
20570 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
20580 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
20590 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
205a0 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
205b0 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
205c0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
205d0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
205e0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
205f0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
20600 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
20610 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
20620 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
20630 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
20640 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
20650 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
20660 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
20670 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
20680 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20690 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
206a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
206b0 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
206c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
206d0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
206e0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
206f0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
20700 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
20710 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
20720 20 65 78 69 73 74 73 20 3d 20 30 3b 20 20 20 20   exists = 0;    
20730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20740 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
20750 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
20760 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  */.  int locked 
20770 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
20780 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
20790 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
207a0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
207b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
207c0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
207d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
207e0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
207f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
20800 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 2a  ger->fd) );..  *
20810 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72  pExists = 0;.  r
20820 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
20830 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
20840 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
20850 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
20860 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66  , &exists);.  if
20870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20880 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
20890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
208a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
208b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
208c0 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
208d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
208e0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
208f0 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20   int nPage;.    
20900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20910 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
20920 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
20930 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20950 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
20960 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20970 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
20980 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
20990 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
209a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
209b0 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
209c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
209d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
209e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
209f0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
20a00 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
20a10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20a20 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
20a30 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
20a40 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
20a50 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
20a60 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
20a70 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
20a80 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
20a90 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
20aa0 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
20ab0 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
20ac0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
20ad0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
20ae0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
20af0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
20b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
20b10 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
20b20 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
20b30 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
20b40 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
20b50 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
20b60 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
20b70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
20b80 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
20b90 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
20ba0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
20bb0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
20bc0 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
20bd0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
20be0 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
20bf0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
20c00 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  ->pgno;       /*
20c10 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
20c20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  read */.  int rc
20c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c40 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20c50 20 63 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69   code */.  i64 i
20c60 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
20c70 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
20c80 6f 66 66 73 65 74 20 6f 66 20 66 69 6c 65 20 74  offset of file t
20c90 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a  o read from */..
20ca0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20cb0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
20cc0 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44 42 20  HARED && !MEMDB 
20cd0 29 3b 0a 0a 20 20 69 66 28 20 21 69 73 4f 70 65  );..  if( !isOpe
20ce0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
20cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20d00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
20d10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20d20 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
20d30 45 41 44 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73  EAD;.  }.  iOffs
20d40 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
20d50 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
20d60 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
20d70 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
20d80 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
20d90 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
20da0 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  ze, iOffset);.  
20db0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
20dc0 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
20dd0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
20de0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
20df0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
20e00 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
20e10 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
20e20 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
20e30 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43  s));.  }.  CODEC
20e40 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
20e50 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a  Data, pgno, 3);.
20e60 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
20e70 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
20e80 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
20e90 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
20ea0 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
20eb0 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
20ec0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
20ed0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
20ee0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
20ef0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
20f00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20f10 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
20f20 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
20f30 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
20f40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20f50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20f60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
20f70 65 6e 65 76 65 72 20 74 68 65 20 75 70 70 65 72  enever the upper
20f80 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 73 20   layer requests 
20f90 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61  a database.** pa
20fa0 67 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ge is requested,
20fb0 20 62 65 66 6f 72 65 20 74 68 65 20 63 61 63 68   before the cach
20fc0 65 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  e is checked for
20fd0 20 61 20 73 75 69 74 61 62 6c 65 20 70 61 67 65   a suitable page
20fe0 0a 2a 2a 20 6f 72 20 61 6e 79 20 64 61 74 61 20  .** or any data 
20ff0 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
21000 20 64 61 74 61 62 61 73 65 2e 20 49 74 20 70 65   database. It pe
21010 72 66 6f 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f  rforms the follo
21020 77 69 6e 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63  wing.** two func
21030 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tions:.**.**   1
21040 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
21050 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
21060 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
21070 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
21080 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
21090 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
210a0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
210b0 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
210c0 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
210d0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
210e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
210f0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
21100 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
21110 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
21120 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
21130 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
21140 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
21150 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
21160 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
21170 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
21180 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
21190 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
211a0 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
211b0 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
211c0 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
211d0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
211e0 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
211f0 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
21200 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21210 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
21220 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
21230 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
21240 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
21250 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
21260 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
21270 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
21280 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
21290 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
212a0 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
212b0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
212c0 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
212d0 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
212e0 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
212f0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
21300 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
21310 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
21320 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
21330 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
21340 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
21350 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
21360 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
21370 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
21380 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
21390 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65  the operation de
213a0 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61  scribed by (2) a
213b0 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65  bove is not atte
213c0 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68  mpted, and if th
213d0 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e  e.** pager is in
213e0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
213f0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
21400 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73  E_FULL when this
21410 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74   is called,.** t
21420 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
21430 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
21440 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72  urned. It is per
21450 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74  mitted to read t
21460 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  he.** database w
21470 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55  hen in SQLITE_FU
21480 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  LL error state..
21490 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
214a0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
214b0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
214c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
214d0 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f  ned. If an.** IO
214e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
214f0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
21500 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
21510 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
21520 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20  rnal.** file or 
21530 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
21540 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
21550 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
21560 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
21570 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
21580 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
21590 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
215a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
215c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
215d0 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65  .  int isErrorRe
215e0 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
215f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21600 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d   recovering from
21610 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
21620 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
21630 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
21640 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
21650 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75  ccess, has no ou
21660 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
21670 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  page references 
21680 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72  and is in an err
21690 6f 72 2d 73 74 61 74 65 2c 20 74 68 69 73 20 69  or-state, this i
216a0 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  s a chance to cl
216b0 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
216c0 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
216d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
216e0 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
216f0 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f  treat any.  ** o
21700 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
21710 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
21720 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d  l..  */.  if( !M
21730 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
21740 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
21750 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
21760 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
21770 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26  r->pPCache)==0 &
21780 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
21790 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  e .  ){.    if( 
217a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
217b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 73 45  fd) ){.      isE
217c0 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
217d0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
217e0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
217f0 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
21800 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
21810 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
21820 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69  pager is still i
21830 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
21840 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  , do not proceed
21850 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a  . The error .  *
21860 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20  * state will be 
21870 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20  cleared at some 
21880 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
21890 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67  ure when all pag
218a0 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  e .  ** referenc
218b0 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61  es are dropped a
218c0 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e  nd the cache can
218d0 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
218e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
218f0 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
21900 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
21910 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
21920 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21930 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
21940 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
21950 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
21960 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
21970 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
21980 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
21990 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
219a0 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
219b0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  rnal = 0;.    as
219c0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
219d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
219e0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
219f0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
21a00 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
21a10 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
21a20 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63  lock ){.      rc
21a30 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
21a40 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
21a50 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
21a60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21a70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
21a80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
21a90 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
21aa0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
21ab0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
21ac0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
21ad0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
21ae0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
21af0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
21b00 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
21b10 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
21b20 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  HARED;.    }.   
21b30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21b40 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
21b50 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  OCK );..    /* I
21b60 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
21b70 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
21b80 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
21b90 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
21ba0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
21bb0 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
21bc0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
21bd0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
21be0 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
21bf0 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65    if( !isErrorRe
21c00 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  set ){.      rc 
21c10 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
21c20 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f  pPager, &isHotJo
21c30 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
21c40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21c50 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
21c60 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
21c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
21c80 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73  ErrorReset || is
21c90 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
21ca0 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
21cb0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
21cc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21cd0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
21ce0 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
21cf0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
21d00 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
21d10 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
21d20 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
21d30 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
21d40 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
21d50 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
21d60 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
21d70 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
21d80 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
21d90 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
21da0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
21db0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
21dc0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
21dd0 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
21de0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
21df0 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
21e00 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
21e10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
21e20 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
21e30 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
21e40 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
21e50 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
21e60 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
21e70 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
21e80 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
21e90 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
21ea0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21eb0 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
21ec0 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
21ed0 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
21ee0 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
21ef0 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
21f00 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
21f10 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
21f20 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
21f30 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
21f40 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49  r->state<EXCLUSI
21f50 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
21f60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
21f70 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
21f80 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
21f90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
21fa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21fb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
21fc0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
21fd0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
21fe0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
21ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22000 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
22010 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
22020 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
22030 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
22040 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
22050 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
22060 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
22070 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
22080 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
22090 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
220a0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
220b0 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
220c0 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  ** possibly used
220d0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
220e0 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20  on later on. On 
220f0 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68  some systems, th
22100 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75  e.      ** OsTru
22110 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
22120 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
22130 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
22140 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
22150 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
22160 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
22170 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
22180 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
22190 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fd) ){.        i
221a0 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
221b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
221c0 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72  cess(pVfs,pPager
221d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54  ->zJournal,SQLIT
221e0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
221f0 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
22200 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
22220 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
22230 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
22240 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
22250 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
22260 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
22270 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
22280 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
22290 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
222a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
222b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
222c0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
222d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
222e0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
222f0 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
22300 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
22310 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22320 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
22330 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
22340 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
22350 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
22360 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
22370 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
22380 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22390 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
223a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
223b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
223c0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
223d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
223e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
223f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
22400 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
22410 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ist, that means 
22420 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
22430 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ss.            *
22440 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f  * has already ro
22450 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a  lled it back */.
22460 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22470 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
22480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22490 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
224a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
224b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
224c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
224d0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f    }..      /* TO
224e0 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65 73  DO: Why are thes
224f0 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20  e cleared here? 
22500 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f  Is it necessary?
22510 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
22520 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
22530 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
22540 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
22550 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
22560 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
22570 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
22580 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
22590 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
225a0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
225b0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
225c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
225d0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
225e0 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
225f0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
22600 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
22610 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
22620 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
22630 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
22640 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
22650 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
22660 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
22670 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  t cache..      *
22680 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  /.      sqlite3P
22690 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
226a0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
226b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
226c0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
226d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
226e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
226f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22700 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
22710 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  c);.        goto
22720 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
22730 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
22740 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
22750 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
22760 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
22770 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
22780 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
22790 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
227a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
227b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
227c0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
227d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
227e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  >0 ){.      /* T
227f0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
22800 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
22810 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
22820 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
22830 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
22840 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
22850 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
22860 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
22870 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
22880 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22890 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
228a0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
228b0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65  .      ** has be
228c0 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
228d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
228e0 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
228f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
22900 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  che..      **.  
22910 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
22920 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
22930 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
22940 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
22950 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
22960 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
22970 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
22980 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
22990 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
229a0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
229b0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
229c0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
229d0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
229e0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
229f0 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
22a00 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
22a10 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
22a20 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
22a30 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
22a40 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
22a50 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
22a60 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
22a70 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
22a80 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
22a90 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
22aa0 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
22ab0 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
22ac0 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
22ad0 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
22ae0 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
22af0 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
22b00 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
22b10 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
22b20 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
22b30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
22b40 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
22b50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20  ager, 0);..     
22b60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
22b70 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
22b80 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
22b90 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f  Code;.        go
22ba0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
22bb0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
22bc0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
22bd0 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 69  Valid );.      i
22be0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
22bf0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
22c00 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
22c10 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
22c20 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
22c30 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
22c40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
22c50 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
22c60 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
22c70 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
22c80 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
22c90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
22cb0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
22cc0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
22cd0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
22ce0 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
22cf0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
22d00 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
22d10 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
22d20 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
22d30 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
22d40 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
22d50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
22d60 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
22d70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
22d80 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
22d90 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
22da0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ode || pPager->s
22db0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
22dc0 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ED );.  }.. fail
22dd0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
22de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
22df0 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
22e00 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
22e10 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
22e20 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  nd in-memory dat
22e30 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70  abases. */.    p
22e40 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
22e50 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
22e60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
22e70 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
22e80 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
22e90 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
22ea0 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
22eb0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
22ec0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
22ed0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
22ee0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
22ef0 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
22f00 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  er){.  if( sqlit
22f10 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
22f20 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22f30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65  )==0 ){.    page
22f40 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
22f50 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
22f60 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20  }../*.** Drop a 
22f70 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 63 61  page from the ca
22f80 63 68 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  che using sqlite
22f90 33 50 63 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a  3PcacheDrop()..*
22fa0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 61  *.** If this mea
22fb0 6e 73 20 74 68 65 72 65 20 61 72 65 20 6e 6f 77  ns there are now
22fc0 20 6e 6f 20 70 61 67 65 73 20 77 69 74 68 20 72   no pages with r
22fd0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
22fe0 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  m, a rollback.**
22ff0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
23000 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
23010 62 61 73 65 20 69 73 20 72 65 6d 6f 76 65 64 2e  base is removed.
23020 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23030 70 61 67 65 72 44 72 6f 70 50 61 67 65 28 44 62  pagerDropPage(Db
23040 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
23050 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
23060 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c  g->pPager;.  sql
23070 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
23080 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f  Pg);.  pagerUnlo
23090 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
230a0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  r);.}../*.** Acq
230b0 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
230c0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
230d0 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
230e0 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
230f0 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
23100 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
23110 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
23120 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
23130 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
23140 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
23150 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
23160 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
23170 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
23180 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
23190 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
231a0 29 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  ) to obtain a SH
231b0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 0a 2a 2a 20  ARED lock on.** 
231c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
231d0 65 20 69 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  e if such a lock
231e0 20 6f 72 20 67 72 65 61 74 65 72 20 69 73 20 6e   or greater is n
231f0 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  ot already held.
23200 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20 63 61 75  .** This may cau
23210 73 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  se hot-journal r
23220 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 63 61 63  ollback or a cac
23230 68 65 20 70 75 72 67 65 2e 20 53 65 65 20 63 6f  he purge. See co
23240 6d 6d 65 6e 74 73 0a 2a 2a 20 61 62 6f 76 65 20  mments.** above 
23250 66 75 6e 63 74 69 6f 6e 20 70 61 67 65 72 53 68  function pagerSh
23260 61 72 65 64 4c 6f 63 6b 28 29 20 66 6f 72 20 64  aredLock() for d
23270 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  etails..**.** If
23280 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
23290 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
232a0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
232b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
232c0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
232d0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
232e0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
232f0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
23300 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
23310 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23320 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
23330 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
23340 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
23350 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
23360 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
23370 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
23380 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
23390 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
233a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
233b0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
233c0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
233d0 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
233e0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
233f0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
23400 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
23410 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
23420 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
23430 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
23440 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
23450 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
23460 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
23470 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
23480 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
23490 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
234a0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
234b0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
234c0 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
234d0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
234e0 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
234f0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
23500 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
23510 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
23520 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
23530 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
23540 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
23550 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
23560 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
23570 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
23580 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
23590 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
235a0 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
235b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
235c0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
235d0 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
235e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
235f0 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
23600 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
23610 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
23620 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
23630 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
23640 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
23650 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
23660 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72  urs in two seper
23670 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  ate scenarios:.*
23680 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
23690 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
236a0 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
236b0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
236c0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
236d0 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
236e0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
236f0 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
23700 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
23710 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
23720 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 70 6f   the cache to po
23730 70 75 6c 61 74 65 20 77 69 74 68 20 74 68 65 20  pulate with the 
23740 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
23750 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
23760 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
23770 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
23780 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
23790 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
237a0 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
237b0 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72  ad of.** being r
237c0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
237d0 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
237e0 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
237f0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
23800 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
23810 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
23820 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
23830 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
23840 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
23850 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
23860 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
23870 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
23880 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
23890 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
238a0 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
238b0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
238c0 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
238d0 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
238e0 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
238f0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
23900 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
23910 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
23920 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
23930 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
23940 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
23950 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
23960 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
23970 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
23980 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
23990 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
239a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
239b0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
239c0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
239d0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
239e0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
239f0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
23a00 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
23a10 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
23a20 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
23a30 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
23a40 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
23a50 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
23a60 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
23a70 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
23a80 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
23a90 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
23aa0 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
23ab0 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
23ac0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
23ad0 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
23ae0 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
23af0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
23b00 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
23b10 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
23b20 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
23b30 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
23b40 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
23b50 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
23b60 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
23b70 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
23b80 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
23b90 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
23ba0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23bb0 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
23bc0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
23bd0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
23be0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23bf0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
23c00 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
23c10 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
23c20 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
23c30 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
23c40 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
23c50 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
23c60 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
23c70 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
23c80 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
23c90 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
23ca0 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
23cb0 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
23cc0 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  Pg = 0;.  int rc
23cd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  ;..  assert( ass
23ce0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
23cf0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
23d00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
23d10 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
23d20 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69   .       || sqli
23d30 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
23d40 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
23d50 65 29 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  e)>0 .       || 
23d60 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20  pgno==1.  );..  
23d70 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
23d80 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
23d90 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
23da0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
23db0 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
23dc0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
23dd0 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
23de0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
23df0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
23e00 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
23e10 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
23e20 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
23e30 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
23e40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
23e50 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
23e60 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
23e70 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
23e80 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
23e90 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
23ea0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70  Pager!=0 );.  *p
23eb0 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pPage = 0;..  /*
23ec0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
23ed0 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
23ee0 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
23ef0 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
23f00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23f10 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72   file. pagerShar
23f20 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  edLock() is a no
23f30 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64  -op if .  ** a d
23f40 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20  atabase lock is 
23f50 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20  already held..  
23f60 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53  */.  rc = pagerS
23f70 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  haredLock(pPager
23f80 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
23f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
23fa0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
23fb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
23fc0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
23fd0 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  CK );..  rc = sq
23fe0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
23ff0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
24000 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29  , pgno, 1, &pPg)
24010 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
24030 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
24040 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d  sert( pPg->pgno=
24050 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
24060 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
24070 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70  pPager || pPg->p
24080 50 61 67 65 72 3d 3d 30 20 29 3b 0a 20 20 69 66  Pager==0 );.  if
24090 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30  ( pPg->pPager==0
240a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
240b0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
240c0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
240d0 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
240e0 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
240f0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
24100 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
24110 4d 61 78 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  Max;.    PAGER_I
24120 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
24130 73 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  s);.    pPg->pPa
24140 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
24150 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24160 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
24170 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20  ager, &nMax);.  
24180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24190 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
241a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
241b0 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Pg);.      retur
241c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
241d0 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
241e0 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
241f0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
24200 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
24210 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
24220 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24230 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
24240 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24250 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
24260 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
24270 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
24280 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
24290 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
242a0 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
242b0 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
242c0 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
242d0 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
242e0 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
242f0 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
24300 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
24310 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
24320 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
24330 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
24340 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
24350 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
24360 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
24370 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
24380 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
24390 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
243a0 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
243b0 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
243c0 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
243d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
243e0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
243f0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
24400 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
24410 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
24420 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
24430 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
24440 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
24450 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
24460 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
24470 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
24480 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
24490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
244a0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
244b0 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
244c0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
244d0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
244e0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
244f0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
24500 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
24510 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
24520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24530 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
24540 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
24550 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
24560 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
24570 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
24580 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
24590 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
245a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
245b0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
245c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   );.      rc = r
245d0 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
245e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
245f0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
24600 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
24610 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
24620 20 20 70 61 67 65 72 44 72 6f 70 50 61 67 65 28    pagerDropPage(
24630 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
24640 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
24650 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
24660 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
24670 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
24680 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
24690 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
246a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
246b0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
246c0 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
246d0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
246e0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
246f0 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 7d 0a 0a  er->nHit);.  }..
24700 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
24710 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24720 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
24730 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
24740 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
24750 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
24760 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
24770 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
24780 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
24790 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
247a0 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
247b0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
247c0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c  not in cache. Al
247d0 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20  so, return 0 if 
247e0 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73  the .** pager is
247f0 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
24800 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
24810 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
24820 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  led,.** or if th
24830 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
24840 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
24850 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
24860 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
24870 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
24880 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
24890 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
248a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
248b0 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
248c0 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
248d0 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
248e0 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
248f0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
24900 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
24910 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
24920 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
24930 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
24940 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
24950 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
24960 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
24970 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
24980 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
24990 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
249a0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
249b0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
249c0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
249d0 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
249e0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
249f0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
24a00 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 67   );..  if( (pPag
24a10 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
24a20 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28  _UNLOCK).   && (
24a30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
24a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
24a50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
24a60 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b  QLITE_FULL).  ){
24a70 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
24a80 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
24a90 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
24aa0 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  , &pPg);.  }..  
24ab0 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
24ac0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
24ad0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
24ae0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
24af0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
24b00 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
24b10 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
24b20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
24b30 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
24b40 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
24b50 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
24b60 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
24b70 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
24b80 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
24b90 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
24ba0 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
24bb0 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
24bc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24bd0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
24be0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
24bf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
24c00 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
24c10 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
24c20 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
24c30 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
24c40 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  sed(pPager);.  }
24c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
24c60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
24c70 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  le has already b
24c80 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75  een opened, ensu
24c90 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73  re that the.** s
24ca0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
24cb0 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20  is open too. If 
24cc0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
24cd0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a   is not open,.**
24ce0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24cf0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
24d00 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24d10 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
24d20 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
24d30 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a  ing to plan. .**
24d40 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   An SQLITE_IOERR
24d50 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
24d60 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
24d70 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c   call to .** sql
24d80 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61 69  ite3OsOpen() fai
24d90 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
24da0 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
24db0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24dc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24dd0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73 4f  TE_OK;.  if( isO
24de0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
24df0 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
24e00 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
24e10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
24e20 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
24e30 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
24e40 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  RY ){.      sqli
24e50 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
24e60 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
24e70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24e80 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
24e90 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
24ea0 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
24eb0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
24ec0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
24ed0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24ee0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24ef0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74  n is called at t
24f00 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72  he start of ever
24f10 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  y write transact
24f20 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ion..** There mu
24f30 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  st already be a 
24f40 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
24f50 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
24f60 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
24f70 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
24f80 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
24f90 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  .**.** Open the 
24fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
24fb0 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e   pager pPager an
24fc0 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61  d write a journa
24fd0 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74  l header.** to t
24fe0 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20  he start of it. 
24ff0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
25000 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ive savepoints, 
25010 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  open the sub-jou
25020 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e  rnal.** as well.
25030 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25040 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
25050 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25060 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f  e is being .** o
25070 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61  pened to write a
25080 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f   rollback log fo
25090 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  r a transaction.
250a0 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
250b0 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  .** when opening
250c0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66   a hot journal f
250d0 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ile to roll it b
250e0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
250f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
25100 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28  s already open (
25110 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  as it may be in 
25120 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c  exclusive mode),
25130 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
25140 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74  nction just writ
25150 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  es a journal hea
25160 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  der to the start
25170 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61   of the.** alrea
25180 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a  dy open file. .*
25190 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
251a0 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
251b0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
251c0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
251d0 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49   the.** Pager.pI
251e0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
251f0 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
25200 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ocated..**.** Re
25210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
25220 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
25230 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
25240 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
25250 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
25260 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
25270 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e   allocate Pager.
25280 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  pInJournal fails
25290 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65  , or .** an IO e
252a0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65  rror code if ope
252b0 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ning or writing 
252c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
252d0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
252e0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
252f0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
25300 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
25310 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
25340 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
25350 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
25360 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
25370 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
25380 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
25390 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
253a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
253b0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
253c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
253d0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
253e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
253f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
25400 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
25410 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
25420 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
25430 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
25440 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70  o-op. */.  if( p
25450 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
25460 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
25470 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
25480 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  }..  /* TODO: Is
25490 20 69 74 20 72 65 61 6c 6c 79 20 70 6f 73 73 69   it really possi
254a0 62 6c 65 20 74 6f 20 67 65 74 20 68 65 72 65 20  ble to get here 
254b0 77 69 74 68 20 64 62 53 69 7a 65 56 61 6c 69 64  with dbSizeValid
254c0 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a 20 20 2a  ==0? If not,.  *
254d0 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 50 61  * the call to Pa
254e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20 63  gerPagecount() c
254f0 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 2e 0a 20  an be removed.. 
25500 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
25510 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
25520 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  lid==0 );.  sqli
25530 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
25540 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20  t(pPager, 0);.. 
25550 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
25560 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
25570 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
25580 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28  ->dbSize);.  if(
25590 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
255a0 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  nal==0 ){.    re
255b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
255c0 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  M;.  }..  /* Ope
255d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
255e0 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
255f0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
25600 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
25610 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
25620 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
25630 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
25640 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
25650 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71  MORY ){.      sq
25660 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
25670 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25680 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25690 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
256a0 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
256b0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
256c0 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
256d0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
256e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
256f0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
25700 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
25710 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
25720 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61  TE|.        (pPa
25730 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20  ger->tempFile ? 
25740 0a 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49  .          (SQLI
25750 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
25760 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
25770 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a  N_TEMP_JOURNAL):
25780 0a 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49  .          (SQLI
25790 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
257a0 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b  RNAL).        );
257b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
257c0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
257d0 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  TE.      rc = sq
257e0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
257f0 28 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73  (.          pVfs
25800 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
25810 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
25820 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
25830 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
25840 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
25850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25860 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
25870 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
25880 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
25890 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
258a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
258b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
258c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
258d0 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  jfd) );.  }...  
258e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
258f0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
25900 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
25910 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
25920 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
25930 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
25940 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  y..  */.  if( rc
25950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25960 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
25970 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
25980 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
25990 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50  uired. */.    pP
259a0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
259b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
259c0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e;.    pPager->j
259d0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
259e0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
259f0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
25a00 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
25a10 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
25a20 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
25a30 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
25a40 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  ster = 0;.    pP
25a50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
25a60 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77   = 0;.    rc = w
25a70 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
25a80 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
25a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25aa0 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
25ab0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20  point ){.    rc 
25ac0 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
25ad0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
25ae0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25af0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
25b00 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
25b10 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
25b20 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
25b30 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
25b40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
25b60 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
25b70 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
25b80 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
25b90 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
25ba0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
25bb0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
25bc0 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
25bd0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
25be0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
25bf0 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
25c00 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
25c10 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
25c20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
25c30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25c40 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
25c50 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
25c60 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
25c70 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
25c80 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
25c90 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
25ca0 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
25cb0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
25cc0 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
25cd0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
25ce0 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
25cf0 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
25d00 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e  e and, the journ
25d10 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f  al file is .** o
25d20 70 65 6e 65 64 20 69 66 20 69 74 20 68 61 73 20  pened if it has 
25d30 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79  not been already
25d40 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  . For a temporar
25d50 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e  y file, the open
25d60 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  ing .** of the j
25d70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
25d80 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
25d90 65 72 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c  ere is an actual
25da0 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69   need to .** wri
25db0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
25dc0 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e  l. TODO: Why han
25dd0 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  dle temporary fi
25de0 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f  les differently?
25df0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
25e00 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
25e10 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74 20 69  ened (or if it i
25e20 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
25e30 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e   then a.** journ
25e40 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69  al-header is wri
25e50 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72  tten to the star
25e60 74 20 6f 66 20 69 74 2e 0a 2a 2f 0a 69 6e 74 20  t of it..*/.int 
25e70 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
25e80 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
25e90 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
25ea0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25eb0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
25ec0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
25ed0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
25ee0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
25ef0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
25f00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
25f10 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
25f20 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
25f30 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50  t( !MEMDB && !pP
25f40 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
25f50 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  ;..    /* Obtain
25f60 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
25f70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25f80 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
25f90 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
25fa0 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
25fb0 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
25fc0 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
25fd0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
25fe0 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75  k. The.    ** bu
25ff0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
26000 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
26010 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
26020 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
26030 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
26040 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
26050 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
26060 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
26070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26080 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
26090 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
260a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
260b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
260c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
260d0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
260e0 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
260f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
26100 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
26110 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
26120 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
26130 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
26140 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 69 72  /* If the requir
26150 65 64 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75  ed locks were su
26160 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
26170 6e 65 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f  ned, open the jo
26180 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
26190 65 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  e and write the 
261a0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
261b0 61 64 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20  ader to it..    
261c0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
261d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
261e0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20  er->useJournal. 
261f0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
26200 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
26210 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
26220 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  F .    ){.      
26230 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
26240 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
26250 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
26260 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
26270 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
26280 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
26290 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
262a0 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20  appens when the 
262b0 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63  pager was in exc
262c0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
262d0 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  de the last.    
262e0 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
262f0 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
26300 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
26310 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
26320 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
26330 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
26340 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
26350 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26360 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
26370 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69  kept open and ei
26380 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74  ther was truncat
26390 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72  ed to 0 bytes or
263a0 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a   its header was.
263b0 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74      ** overwritt
263c0 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  en with zeros.. 
263d0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
263e0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
263f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
26400 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
26410 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
26420 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
26430 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
26440 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
26450 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
26460 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  r);.  }..  PAGER
26470 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
26480 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
26490 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
264a0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
264b0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
264c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
264d0 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
264e0 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
264f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
26500 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74  ark a single dat
26510 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
26520 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ble. The page is
26530 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
26540 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e  e .** main journ
26550 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
26560 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49  l as required. I
26570 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
26580 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e  itten into.** on
26590 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
265a0 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  s, the correspon
265b0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
265c0 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72  in the .** Pager
265d0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
265e0 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  ec and the Pager
265f0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
26600 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a  epoint bitvecs.*
26610 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61  * of any open sa
26620 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72  vepoints as appr
26630 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
26640 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
26650 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
26660 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
26670 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61  pPg->pData;.  Pa
26680 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
26690 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
266a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
266b0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
266c0 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
266d0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
266e0 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
266f0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
26700 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
26710 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
26720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26730 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
26740 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
26750 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
26760 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
26770 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
26780 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
26790 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
267a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
267b0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
267c0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
267d0 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
267e0 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
267f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
26800 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
26810 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
26820 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
26830 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
26840 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
26850 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
26860 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
26870 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
26880 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
26890 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
268a0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
268b0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
268c0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
268d0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
268e0 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
268f0 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
26900 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
26910 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
26920 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
26930 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
26940 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
26950 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
26960 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
26970 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26980 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
26990 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
269a0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
269b0 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
269c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
269d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
269e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
269f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26a00 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
26a10 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
26a20 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
26a30 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
26a40 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  r->useJournal.  
26a50 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
26a60 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
26a70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26a80 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72  E_OFF ){.      r
26a90 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
26aa0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
26ab0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26ac0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
26ad0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
26ae0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
26af0 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  d = 1;.  .    /*
26b00 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
26b10 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
26b20 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
26b30 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
26b40 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
26b50 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
26b60 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
26b70 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
26b80 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
26b90 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
26ba0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
26bb0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
26bc0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
26bd0 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
26be0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73  urnal(pPg) && is
26bf0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26c00 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
26c10 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
26c20 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
26c30 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
26c40 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
26c50 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20  *pData2;..      
26c60 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
26c70 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
26c80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
26c90 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
26ca0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
26cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
26cc0 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
26cd0 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
26ce0 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
26cf0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
26d00 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26d10 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
26d20 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
26d30 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  r) );.        pD
26d40 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
26d50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
26d60 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
26d70 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
26d80 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
26d90 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
26da0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
26db0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
26dc0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
26dd0 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  nalOff, pPg->pgn
26de0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
26df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26e00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26e10 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
26e20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
26e30 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
26e40 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26e70 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
26e80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
26e90 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
26ea0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
26eb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26ec0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26ee0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
26ef0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
26f00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26f10 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
26f20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
26f30 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
26f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26f50 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
26f60 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
26f70 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
26f80 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
26f90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
26fa0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
26fb0 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
26fc0 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
26fd0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
26fe0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
26ff0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
27000 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
27010 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
27020 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
27030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
27040 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
27050 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
27060 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
27070 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
27080 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
27090 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
270a0 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ));..        /* 
270b0 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
270c0 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
270d0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a  occurred while j
270e0 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
270f0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
27100 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
27110 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
27120 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
27130 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
27140 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
27150 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
27160 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
27170 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
27180 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
27190 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
271a0 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
271b0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
271c0 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
271d0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
271e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
271f0 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
27200 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
27210 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
27220 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
27230 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
27240 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27250 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
27260 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
27270 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
27280 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
27290 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
272a0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
272b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
272c0 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72       /* An error
272d0 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69   has occured wri
272e0 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
272f0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
27300 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
27310 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
27320 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
27330 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
27340 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27350 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27360 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
27380 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50     }..        pP
27390 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
273a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
273b0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
273c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
273d0 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
273e0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
273f0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
27400 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
27410 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
27420 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
27430 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
27440 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
27450 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
27460 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
27470 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
27480 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
27490 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
274a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
274b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
274c0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
274d0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
274e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
274f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
27510 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
27520 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
27530 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
27540 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
27550 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
27560 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
27570 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
27580 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
27590 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
275a0 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
275b0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
275c0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
275d0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
275e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
275f0 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
27600 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
27610 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
27620 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
27630 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
27640 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
27650 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
27660 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
27670 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
27680 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
27690 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
276a0 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
276b0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
276c0 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
276d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
276e0 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
276f0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
27700 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
27710 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
27720 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
27730 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
27740 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
27750 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
27760 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
27770 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
27780 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
27790 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
277a0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
277b0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
277c0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
277d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
277e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
277f0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
27800 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
27810 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
27820 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
27830 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  ->pgno;.    if( 
27840 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
27850 28 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  (PAGER_MJ_PGNO(p
27860 50 61 67 65 72 29 2d 31 29 20 29 7b 0a 20 20 20  Pager)-1) ){.   
27870 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
27880 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
27890 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
278a0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
278b0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
278c0 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  le. This routine
278d0 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
278e0 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e  before .** makin
278f0 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  g changes to a p
27900 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  age. The caller 
27910 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
27920 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20  eturn value .** 
27930 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
27940 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
27950 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e  not to change an
27960 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65  y page data unle
27970 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ss .** this rout
27980 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
27990 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
279a0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
279b0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
279c0 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74  n and pager_writ
279d0 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
279e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  .** function als
279f0 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65  o deals with the
27a00 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
27a10 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61  ere 2 or more pa
27a20 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20  ges.** fit on a 
27a30 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
27a40 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
27a50 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74   all co-resident
27a60 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68   pages.** must h
27a70 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
27a80 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
27a90 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  file before retu
27aa0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
27ab0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
27ac0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
27ad0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
27ae0 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
27af0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
27b00 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
27b10 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
27b20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27b30 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
27b40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27b50 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72  ITE_OK;..  PgHdr
27b60 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
27b70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
27b80 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
27b90 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
27ba0 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
27bb0 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
27bc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
27bd0 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65    if( nPagePerSe
27be0 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67  ctor>1 ){.    Pg
27bf0 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20  no nPageCount;  
27c00 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
27c10 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
27c20 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
27c30 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67  e */.    Pgno pg
27c40 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
27c50 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
27c60 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
27c70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
27c80 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  . */.    int nPa
27c90 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
27ca0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27cb0 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
27cc0 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
27cd0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cf0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
27d00 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65  r */.    int nee
27d10 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  dSync = 0;      
27d20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
27d30 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52  y page has PGHDR
27d40 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20  _NEED_SYNC */.. 
27d50 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
27d60 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20  NotSync flag to 
27d70 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
27d80 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
27d90 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ow a journal.   
27da0 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65   ** header to be
27db0 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
27dc0 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
27dd0 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  aled by this fun
27de0 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
27df0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
27e00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27e10 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
27e20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  c==0 );.    pPag
27e30 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
27e40 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  1;..    /* This 
27e50 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
27e60 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
27e70 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
27e80 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
27e90 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
27ea0 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
27eb0 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
27ec0 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
27ed0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
27ee0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
27ef0 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
27f00 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
27f10 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
27f20 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
27f30 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
27f40 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  + 1;..    sqlite
27f50 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
27f60 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26  pPager, (int *)&
27f70 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20  nPageCount);.   
27f80 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
27f90 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
27fa0 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
27fb0 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
27fc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
27fd0 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
27fe0 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
27ff0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
28000 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
28010 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
28020 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
28030 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
28040 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
28050 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
28060 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
28070 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
28080 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
28090 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
280a0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
280b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
280c0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
280d0 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
280e0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
280f0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
28100 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
28110 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
28120 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
28130 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
28140 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
28150 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
28160 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
28170 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28180 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
28190 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
281a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
281b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
281c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
281d0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
281e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
281f0 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
28200 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
28210 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
28220 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
28230 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
28240 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
28250 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28260 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28270 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
28280 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.          }
28290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
282a0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67   }else if( (pPag
282b0 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
282c0 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30  (pPager, pg))!=0
282d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
282e0 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
282f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
28300 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
28310 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
28320 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
28330 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
28340 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
28350 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
28360 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28370 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
28380 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67   any of the nPag
28390 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
283a0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c  starting at pg1,
283b0 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74   then it needs t
283c0 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c  o be set for all
283d0 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73   of them. Becaus
283e0 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67  e.    ** writing
283f0 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65   to any of these
28400 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79   nPage pages may
28410 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65   damage the othe
28420 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a  rs, the.    ** j
28430 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
28440 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65   contain sync()e
28450 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20  d copies of all 
28460 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62  of them.    ** b
28470 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
28480 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  m can be written
28490 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
284a0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
284b0 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
284c0 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
284d0 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  rt( !MEMDB && pP
284e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
284f0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
28500 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e  0; ii<nPage && n
28510 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a  eedSync; ii++){.
28520 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
28530 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
28540 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
28550 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
28560 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20   pPage ){.      
28570 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73      pPage->flags
28580 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
28590 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  YNC;.          s
285a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
285b0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
285c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
285d0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
285e0 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
285f0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
28600 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
28610 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
28620 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b  ->doNotSync = 0;
28630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
28640 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
28650 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
28660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28670 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
28680 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
28690 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
286a0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
286b0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
286c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
286d0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
286e0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
286f0 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
28700 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
28710 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
28720 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
28730 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
28740 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
28750 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
28760 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73  eturn pPg->flags
28770 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a  &PGHDR_DIRTY;.}.
28780 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
28790 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
287a0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
287b0 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
287c0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
287d0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
287e0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
287f0 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
28800 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
28810 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
28820 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
28830 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73   as dirty.  This
28840 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
28850 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74  ample, when.** t
28860 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
28870 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66   added as a leaf
28880 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
28890 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63   and so its.** c
288a0 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72  ontent no longer
288b0 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   matters..**.** 
288c0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
288d0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
288e0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
288f0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
28900 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
28910 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
28920 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d  sed. The pager m
28930 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
28940 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
28950 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
28960 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
28970 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
28980 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
28990 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71  timization can q
289a0 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
289b0 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20  ed of large .** 
289c0 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
289d0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
289e0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
289f0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
28a00 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
28a10 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
28a20 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
28a30 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70  GHDR_DIRTY) && p
28a40 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
28a50 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45  t==0 ){.    PAGE
28a60 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52  RTRACE(("DONT_WR
28a70 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
28a80 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
28a90 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28aa0 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
28ab0 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
28ac0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
28ad0 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66  gno)).    pPg->f
28ae0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
28af0 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66  NT_WRITE;.#ifdef
28b00 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
28b10 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
28b20 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
28b30 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
28b40 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
28b50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
28b60 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
28b70 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ment the value o
28b80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
28b90 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63  ile .** change-c
28ba0 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61  ounter, stored a
28bb0 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65  s a 4-byte big-e
28bc0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74  ndian integer st
28bd0 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79  arting at .** by
28be0 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20  te offset 24 of 
28bf0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
28c00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44  **.** If the isD
28c10 69 72 65 63 74 20 66 6c 61 67 20 69 73 20 7a 65  irect flag is ze
28c20 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  ro, then this is
28c30 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67   done by calling
28c40 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
28c50 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65  rWrite() on page
28c60 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69   1, then modifyi
28c70 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
28c80 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64  of the.** page d
28c90 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ata. In this cas
28ca0 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  e the file will 
28cb0 62 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20  be updated when 
28cc0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
28cd0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
28ce0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
28cf0 68 65 20 69 73 44 69 72 65 63 74 20 66 6c 61 67  he isDirect flag
28d00 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e   may only be non
28d10 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62  -zero if the lib
28d20 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
28d30 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51  d.** with the SQ
28d40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
28d50 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64  IC_WRITE macro d
28d60 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  efined. In this 
28d70 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69  case,.** if isDi
28d80 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rect is non-zero
28d90 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
28da0 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61  ase file is upda
28db0 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  ted directly.** 
28dc0 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70  by writing an up
28dd0 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  dated version of
28de0 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20   page 1 using a 
28df0 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20  call to the .** 
28e00 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
28e10 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
28e20 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
28e30 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
28e40 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
28e50 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64   int isDirectMod
28e60 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
28e70 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
28e80 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74  Declare and init
28e90 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20  ialize constant 
28ea0 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63  integer 'isDirec
28eb0 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  t'. If the.  ** 
28ec0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
28ed0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61  imization is ena
28ee0 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
28ef0 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63  ld, then isDirec
28f00 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61  t.  ** is initia
28f10 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
28f20 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
28f30 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61   isDirectMode pa
28f40 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20  rameter.  ** to 
28f50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
28f60 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
28f70 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65  always set to ze
28f80 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ro..  **.  ** Th
28f90 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69  e idea is that i
28fa0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
28fb0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
28fc0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62  is not.  ** enab
28fd0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
28fe0 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65  ime, the compile
28ff0 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74  r can omit the t
29000 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73  ests of.  ** 'is
29010 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61  Direct' below, a
29020 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c  s well as the bl
29030 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20  ock enclosed in 
29040 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73  the.  ** "if( is
29050 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74  Direct )" condit
29060 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
29070 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29080 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 63  ATOMIC_WRITE.  c
29090 6f 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65 63  onst int isDirec
290a0 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  t = 0;.  assert(
290b0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30   isDirectMode==0
290c0 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
290d0 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d  AMETER(isDirectM
290e0 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f  ode);.#else.  co
290f0 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74  nst int isDirect
29100 20 3d 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3b   = isDirectMode;
29110 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
29120 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
29130 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
29140 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
29150 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
29160 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ne && pPager->db
29170 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67  Size>0 ){.    Pg
29180 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20  Hdr *pPgHdr;    
29190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
291a0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
291b0 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68   1 */.    u32 ch
291c0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20  ange_counter;   
291d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
291e0 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e  al value of chan
291f0 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
29200 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
29210 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
29220 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  le && isOpen(pPa
29230 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20  ger->fd) );..   
29240 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
29250 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
29260 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
29270 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29280 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
29290 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73  &pPgHdr);.    as
292a0 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20  sert( pPgHdr==0 
292b0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
292c0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
292d0 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63  age one was fetc
292e0 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  hed successfully
292f0 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
29300 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  ion is not.    *
29310 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64  * operating in d
29320 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65  irect-mode, make
29330 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65   page 1 writable
29340 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29350 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29360 26 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20  & !isDirect ){. 
29370 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29380 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
29390 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dr);.    }..    
293a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
293b0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  K ){.      /* In
293c0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
293d0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
293e0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
293f0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
29400 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
29410 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
29420 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
29430 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
29440 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
29450 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33  er++;.      put3
29460 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
29470 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c  gHdr->pData)+24,
29480 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
29490 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
294a0 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
294b0 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
294c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
294d0 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
294e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
294f0 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Direct ){.      
29500 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
29510 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61  uf = pPgHdr->pDa
29520 74 61 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ta;.        asse
29530 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69  rt( pPager->dbFi
29540 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20  leSize>0 );.    
29550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29560 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
29570 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
29580 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
29590 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
295a0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
295b0 77 6f 72 6b 65 64 2c 20 73 65 74 20 74 68 65 20  worked, set the 
295c0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
295d0 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69  flag. */.      i
295e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
295f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
29600 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
29610 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
29620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
29630 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
29640 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
29650 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
29660 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
29670 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29680 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
29690 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
296a0 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
296b0 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
296c0 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61  y files.** or pa
296d0 67 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67  ges with the Pag
296e0 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73  er.noSync flag s
296f0 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  et..**.** If suc
29700 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c  cessful, or call
29710 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f  ed on a pager fo
29720 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20  r which it is a 
29730 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66  no-op, this.** f
29740 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
29750 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
29760 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f  wise, an IO erro
29770 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29780 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
29790 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
297a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
297b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
297e0 65 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42  e */.  if( MEMDB
297f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
29800 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  nc ){.    rc = S
29810 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
29820 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
29830 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
29840 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
29850 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
29860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29870 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
29880 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
29890 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
298a0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
298b0 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
298c0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
298d0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
298e0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
298f0 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
29900 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
29910 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
29920 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
29930 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
29940 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
29950 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
29960 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
29970 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
29980 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
29990 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
299a0 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
299b0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
299c0 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
299d0 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
299e0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
299f0 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
29a00 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
29a10 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
29a20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
29a30 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
29a40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29a50 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
29a60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29a70 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
29a80 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
29a90 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
29aa0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
29ab0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
29ac0 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
29ad0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
29ae0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
29af0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
29b00 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
29b10 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
29b20 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
29b30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
29b40 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
29b50 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
29b60 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
29b70 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
29b80 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
29b90 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
29ba0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
29bb0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
29bc0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
29bd0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
29be0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
29bf0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
29c00 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
29c10 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
29c20 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
29c30 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
29c40 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
29c50 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
29c60 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
29c70 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
29c80 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
29c90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29ca0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
29cb0 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
29cc0 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
29cd0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
29ce0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
29cf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29d00 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
29d10 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
29d20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29d30 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
29d40 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
29d50 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
29d60 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
29d70 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
29d80 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
29d90 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29db0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
29dc0 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
29dd0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
29de0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
29df0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
29e00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29e10 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  code */..  if( p
29e20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
29e30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
29e40 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
29e50 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
29e60 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
29e70 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
29e80 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c  =%s nSize=%d\n",
29e90 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
29ea0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
29eb0 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
29ec0 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ze));..  /* If t
29ed0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
29ee0 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
29ef0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
29f00 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
29f10 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
29f20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
29f30 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
29f40 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
29f50 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
29f60 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
29f70 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
29f80 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
29f90 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  {..    /* The fo
29fa0 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70  llowing block up
29fb0 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
29fc0 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c  -counter. Exactl
29fd0 79 20 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20  y how it.    ** 
29fe0 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64  does this depend
29ff0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
2a000 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75  not the atomic-u
2a010 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
2a020 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  on.    ** was en
2a030 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
2a040 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
2a050 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
2a060 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  eets the .    **
2a070 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
2a080 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
2a090 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a  ration: .    **.
2a0a0 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20      **    * The 
2a0b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2a0c0 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
2a0d0 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
2a0e0 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  or.    **      b
2a0f0 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61  locks of size pa
2a100 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20  ge-size, and .  
2a110 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
2a120 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
2a130 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
2a140 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
2a150 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45  nd.    **    * E
2a160 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
2a170 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2a180 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
2a190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2a1a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2a1b0 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2a1c0 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
2a1d0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2a1e0 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
2a1f0 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
2a200 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
2a210 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2a220 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
2a230 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f  change.    ** co
2a240 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
2a250 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
2a260 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2a270 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
2a280 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
2a290 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69  pplicable to thi
2a2a0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  s transaction, c
2a2b0 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  all sqlite3Journ
2a2c0 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a  alCreate().    *
2a2d0 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * to make sure t
2a2e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a2f0 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65  has actually bee
2a300 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  n created, then 
2a310 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  call.    ** page
2a320 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2a330 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2a340 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2a350 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
2a360 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20      ** mode. .  
2a370 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
2a380 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70  rwise, if the op
2a390 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f  timization is bo
2a3a0 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61  th enabled and a
2a3b0 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a  pplicable,.    *
2a3c0 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
2a3d0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2a3e0 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2a3f0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2a400 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64  ter.    ** in 'd
2a410 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20  irect' mode. In 
2a420 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2a430 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
2a440 6e 65 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20  never be.    ** 
2a450 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
2a460 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
2a470 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2a480 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2a490 5f 57 52 49 54 45 0a 20 20 20 20 50 67 48 64 72  _WRITE.    PgHdr
2a4a0 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
2a4b0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2a4c0 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
2a4d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2a4e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2a4f0 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20  _OFF );.    if( 
2a500 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70  !zMaster && isOp
2a510 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2a520 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2a530 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
2a540 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
2a550 65 72 29 20 0a 20 20 20 20 20 26 26 20 70 50 61  er) .     && pPa
2a560 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
2a570 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a  ger->dbFileSize.
2a580 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67       && (0==(pPg
2a590 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2a5a0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2a5b0 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30  ->pPCache)) || 0
2a5c0 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20  ==pPg->pDirty). 
2a5d0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55     ){.      /* U
2a5e0 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
2a5f0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
2a600 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d   via the direct-
2a610 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68  write method. Th
2a620 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  e .      ** foll
2a630 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
2a640 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65  modify the in-me
2a650 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
2a660 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20  ion of page 1 . 
2a670 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75       ** to inclu
2a680 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20 63  de the updated c
2a690 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e  hange counter an
2a6a0 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67  d then write pag
2a6b0 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69  e 1 .      ** di
2a6c0 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
2a6d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63  tabase file. Bec
2a6e0 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
2a6f0 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20  ic-write .      
2a700 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  ** property of t
2a710 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
2a720 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66  tem, this is saf
2a730 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2a740 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2a750 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2a760 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2a770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2a780 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2a790 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
2a7a0 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
2a7b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a7c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2a7d0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2a7e0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2a7f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a800 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70  #else.    rc = p
2a810 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2a820 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2a830 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
2a840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a850 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2a860 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2a870 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
2a880 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
2a890 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
2a8a0 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
2a8b0 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20  ll pages.    ** 
2a8c0 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
2a8d0 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
2a8e0 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
2a8f0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2a900 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68  .    ** file. Th
2a910 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
2a920 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
2a930 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  m mode..    **. 
2a940 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61     ** Before rea
2a950 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77  ding the pages w
2a960 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
2a970 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2a980 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
2a990 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
2a9a0 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69  dbSize, set dbSi
2a9b0 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
2a9c0 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  alue.    ** that
2a9d0 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20   it took at the 
2a9e0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
2a9f0 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  nsaction. Otherw
2aa00 69 73 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ise, the.    ** 
2aa10 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2aa20 50 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72  PagerGet() retur
2aa30 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69  n zeroed pages i
2aa40 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a  nstead of .    *
2aa50 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20 66  * reading data f
2aa60 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2aa70 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   file..    */.#i
2aa80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2aa90 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2aaa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2aab0 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72  ize<pPager->dbOr
2aac0 69 67 53 69 7a 65 0a 20 20 20 20 20 26 26 20 70  igSize.     && p
2aad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2aae0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2aaf0 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 29  LMODE_OFF .    )
2ab00 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20  {.      Pgno i; 
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab30 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2ab40 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
2ab50 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70  const Pgno iSkip
2ab60 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
2ab70 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e  (pPager); /* Pen
2ab80 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a  ding lock page *
2ab90 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67  /.      const Pg
2aba0 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  no dbSize = pPag
2abb0 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20  er->dbSize;     
2abc0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d    /* Database im
2abd0 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20  age size */ .   
2abe0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2abf0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
2ac00 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f  igSize;.      fo
2ac10 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69  r( i=dbSize+1; i
2ac20 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
2ac30 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
2ac40 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
2ac50 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
2ac60 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
2ac70 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  i) && i!=iSkip )
2ac80 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64  {.          PgHd
2ac90 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  r *pPage;       
2aca0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
2acb0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
2acc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2acd0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2ace0 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, i, &pPage);. 
2acf0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2ad00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2ad10 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2ad20 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2ad30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ad40 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29  agerWrite(pPage)
2ad50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2ad60 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2ad70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2ad80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ad90 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2ada0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2adb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2adc0 7d 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  } .      pPager-
2add0 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65  >dbSize = dbSize
2ade0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2adf0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2ae00 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2ae10 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
2ae20 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
2ae30 20 6d 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20   master .    ** 
2ae40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2ae50 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
2ae60 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
2ae70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2ae80 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d  .    ** or if zM
2ae90 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e  aster is NULL (n
2aea0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
2aeb0 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  ), then this cal
2aec0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
2aed0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72    */.    rc = wr
2aee0 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
2aef0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
2af00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2af10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2af20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2af30 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
2af40 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2af50 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f  file. If the ato
2af60 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
2af70 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ization is being
2af80 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68  .    ** used, th
2af90 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  is call will not
2afa0 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72   create the jour
2afb0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66  nal file or perf
2afc0 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72  orm any.    ** r
2afd0 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20  eal IO..    */. 
2afe0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
2aff0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2b000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b010 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2b020 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2b030 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
2b040 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
2b050 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b060 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ile. */.    rc =
2b070 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2b080 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63 61  elist(sqlite3Pca
2b090 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2b0a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a  ger->pPCache));.
2b0b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b0c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2b0d0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2b0e0 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
2b0f0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f  );.      goto co
2b100 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2b110 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xit;.    }.    s
2b120 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
2b130 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
2b140 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ache);..    /* I
2b150 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
2b160 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
2b170 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
2b180 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
2b190 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70     ** then use p
2b1a0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f  ager_truncate to
2b1b0 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20   grow or shrink 
2b1c0 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  the file here.. 
2b1d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
2b1e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50  ager->dbSize!=pP
2b1f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2b200 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2b210 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  New = pPager->db
2b220 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e  Size - (pPager->
2b230 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a  dbSize==PAGER_MJ
2b240 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
2b250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2b260 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2b270 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
2b280 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b290 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
2b2a0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , nNew);.      i
2b2b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b2c0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2b2d0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2b2e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
2b2f0 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64  ally, sync the d
2b300 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2b310 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
2b320 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
2b330 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
2b340 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2b350 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2b360 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2b370 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
2b380 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
2b390 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
2b3a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2b3b0 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
2b3c0 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65   }..commit_phase
2b3d0 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 69 66 28  _one_exit:.  if(
2b3e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
2b3f0 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  R_BLOCKED ){.   
2b400 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   /* pager_incr_c
2b410 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d  hangecounter() m
2b420 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  ay attempt to ob
2b430 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
2b440 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 74 6f  e.    ** lock to
2b450 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
2b460 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52   and return IOER
2b470 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73  R_BLOCKED. But s
2b480 69 6e 63 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  ince .    ** the
2b490 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
2b4a0 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63  the cache is inc
2b4b0 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73  onsistent, it is
2b4c0 0a 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74  .    ** better t
2b4d0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
2b4e0 42 55 53 59 2e 0a 20 20 20 20 2a 2a 2f 0a 20 20  BUSY..    **/.  
2b4f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
2b500 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  SY;.  }.  return
2b510 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
2b520 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2b530 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
2b540 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2b550 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  as been complete
2b560 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f  ly.** updated to
2b570 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61   reflect the cha
2b580 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65  nges made by the
2b590 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2b5a0 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63  tion and.** sync
2b5b0 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20  ed to disk. The 
2b5c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69  journal file sti
2b5d0 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ll exists in the
2b5e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
2b5f0 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20   though, and if 
2b600 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
2b610 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
2b620 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  t will eventuall
2b630 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20  y.** be used as 
2b640 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
2b650 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  d the current tr
2b660 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64  ansaction rolled
2b670 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
2b680 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c  s function final
2b690 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
2b6a0 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79   file, either by
2b6b0 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74   deleting, .** t
2b6c0 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72  runcating or par
2b6d0 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69  tially zeroing i
2b6e0 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  t, so that it ca
2b6f0 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a  nnot be used .**
2b700 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   for hot-journal
2b710 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20   rollback. Once 
2b720 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65  this is done the
2b730 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
2b740 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63  ** irrevocably c
2b750 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
2b760 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2b770 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
2b780 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2b790 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a   and the pager.*
2b7a0 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65  * moves into the
2b7b0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74   error state. Ot
2b7c0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
2b7d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
2b7e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2b7f0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
2b800 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
2b810 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2b820 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2b830 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2b840 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2b850 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20   Do not proceed 
2b860 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
2b870 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
2b880 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
2b890 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2b8a0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
2b8b0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2b8c0 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  de;.  }..  /* Th
2b8d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2b8e0 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
2b8f0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
2b900 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74   not in at least
2b910 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .  ** PAGER_RESE
2b920 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e 64 20  RVED state. And 
2b930 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20 6e 65  indeed SQLite ne
2b940 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e 20 42  ver does this. B
2b950 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69  ut it is.  ** ni
2b960 63 65 20 74 6f 20 68 61 76 65 20 74 68 69 73 20  ce to have this 
2b970 64 65 66 65 6e 73 69 76 65 20 62 6c 6f 63 6b 20  defensive block 
2b980 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  here anyway..  *
2b990 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2b9a0 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
2b9b0 52 5f 52 45 53 45 52 56 45 44 29 20 29 7b 0a 20  R_RESERVED) ){. 
2b9c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b9d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
2b9e0 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * An optimizatio
2b9f0 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  n. If the databa
2ba00 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61  se was not actua
2ba10 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72  lly modified dur
2ba20 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72  ing.  ** this tr
2ba30 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70  ansaction, the p
2ba40 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
2ba50 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
2ba60 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73  e and is.  ** us
2ba70 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a  ing persistent j
2ba80 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68  ournals, then th
2ba90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2baa0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a   no-op..  **.  *
2bab0 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74  * The start of t
2bac0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bad0 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
2bae0 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72  ns a single jour
2baf0 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72  nal .  ** header
2bb00 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66   with the nRec f
2bb10 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49  ield set to 0. I
2bb20 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c  f such a journal
2bb30 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a   is used as.  **
2bb40 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64   a hot-journal d
2bb50 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
2bb60 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68  l rollback, 0 ch
2bb70 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
2bb80 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  de.  ** to the d
2bb90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
2bba0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2bbb0 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f  d to zero the jo
2bbc0 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
2bbd0 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  er. Since the pa
2bbe0 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
2bbf0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20  ive mode, there 
2bc00 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20  is no need.  ** 
2bc10 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b  to drop any lock
2bc20 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  s either..  */. 
2bc30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
2bc40 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50  odified==0 && pP
2bc50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2bc60 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65  ode .   && pPage
2bc70 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2bc80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2bc90 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20  E_PERSIST.  ){. 
2bca0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2bcb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
2bcc0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
2bcd0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 65 74  ager) );.    ret
2bce0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2bcf0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2bd00 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  (("COMMIT %d\n",
2bd10 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2bd20 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
2bd30 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2bd40 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d  ER_SYNCED || MEM
2bd50 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  DB || !pPager->d
2bd60 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 72  bModified );.  r
2bd70 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
2bd80 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2bd90 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2bda0 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ter);.  return p
2bdb0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2bdc0 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
2bdd0 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
2bde0 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74 61 62  anges. The datab
2bdf0 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
2be00 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
2be10 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ode..**.** This 
2be20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
2be30 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a  s two tasks:.**.
2be40 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c 73  **   1) It rolls
2be50 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61   back the journa
2be60 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e  l file, restorin
2be70 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  g all database f
2be80 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  ile and .**     
2be90 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2bea0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 73 74   pages to the st
2beb0 61 74 65 20 74 68 65 79 20 77 65 72 65 20 69 6e  ate they were in
2bec0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
2bed0 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77 61  ction.**      wa
2bee0 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a  s opened, and.**
2bef0 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c 69 7a     2) It finaliz
2bf00 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
2bf10 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69 74 20  ile, so that it 
2bf20 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20  is not used for 
2bf30 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  hot.**      roll
2bf40 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f 69 6e  back at any poin
2bf50 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
2bf60 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74  .**.** subject t
2bf70 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2bf80 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a 0a  qualifications:.
2bf90 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 6a  **.** * If the j
2bfa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2bfb0 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68 65 6e  ot yet open when
2bfc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2bfd0 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74  s called,.**   t
2bfe0 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73 20  hen only (2) is 
2bff0 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74 68  performed. In th
2c000 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
2c010 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   no journal file
2c020 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62 61  .**   to roll ba
2c030 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69  ck..**.** * If i
2c040 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2c050 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2c060 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74 61  TE_FULL, then ta
2c070 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20 20 20  sk (1) is .**   
2c080 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20 73 75  performed. If su
2c090 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b 20 28  ccessful, task (
2c0a0 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  2). Regardless o
2c0b0 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a  f the outcome.**
2c0c0 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20 74 68     of either, th
2c0d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
2c0e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2c0f0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
2c100 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65 69  er.**   (i.e. ei
2c110 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
2c120 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52 52  R or SQLITE_CORR
2c130 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  UPT)..**.** * If
2c140 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
2c150 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
2c160 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2c170 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68 65 72  mpt (1). Whether
2c180 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31 29  .**   or not (1)
2c190 20 69 73 20 73 75 63 63 75 73 73 66 75 6c 2c 20   is succussful, 
2c1a0 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28 32 29  also attempt (2)
2c1b0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2c1c0 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51 4c   return.**   SQL
2c1d0 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
2c1e0 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  e, enter the err
2c1f0 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
2c200 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 0a 2a  urn the first .*
2c210 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65 20 65  *   error code e
2c220 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a  ncountered. .**.
2c230 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
2c240 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  e there is no ch
2c250 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 64 61  ance that the da
2c260 74 61 62 61 73 65 20 77 61 73 20 77 72 69 74 74  tabase was writt
2c270 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20  en to. .**   So 
2c280 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  is safe to final
2c290 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
2c2a0 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65  file even if the
2c2b0 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20 20   playback .**   
2c2c0 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20 66 61  (operation 1) fa
2c2d0 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20 74 68  iled. However th
2c2e0 65 20 70 61 67 65 72 20 6d 75 73 74 20 65 6e 74  e pager must ent
2c2f0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2c300 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65 20 63  te.**   as the c
2c310 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
2c320 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 61  n-memory cache a
2c330 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74 2e 0a  re now suspect..
2c340 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c  **.** * Finally,
2c350 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45 58 43   if in PAGER_EXC
2c360 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
2c370 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
2c380 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d 70  Only.**   attemp
2c390 74 20 28 32 29 20 69 66 20 28 31 29 20 69 73 20  t (2) if (1) is 
2c3a0 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65 74 75  successful. Retu
2c3b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
2c3c0 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 20  successful,.**  
2c3d0 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74 65 72   otherwise enter
2c3e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2c3f0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
2c400 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
2c410 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69 6e  the .**   failin
2c420 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  g operation..**.
2c430 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
2c440 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
2c450 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ile may have bee
2c460 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 53 6f  n written to. So
2c470 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c 61   if the.**   pla
2c480 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
2c490 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65 64 20  did not succeed 
2c4a0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20  it would not be 
2c4b0 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65  safe to finalize
2c4c0 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  .**   the journa
2c4d0 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65 64 73  l file. It needs
2c4e0 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e 20 74   to be left in t
2c4f0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2c500 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d 65  o that.**   some
2c510 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
2c520 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72 65 73  an use it to res
2c530 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
2c540 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a 20 20  e state (by.**  
2c550 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2c560 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73  lback)..*/.int s
2c570 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
2c580 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
2c590 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2c5a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2c5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2c5c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
2c5d0 41 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c 4c  AGERTRACE(("ROLL
2c5e0 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
2c5f0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2c600 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 62   if( !pPager->db
2c610 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69 73 4f  Modified || !isO
2c620 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2c630 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
2c640 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2c650 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2c660 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2c670 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
2c680 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
2c690 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
2c6a0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
2c6b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2c6c0 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
2c6d0 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
2c6e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2c6f0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
2c700 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
2c710 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
2c720 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
2c730 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
2c740 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 20  ESERVED ){.     
2c750 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20   int rc2;.      
2c760 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
2c770 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
2c780 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65        rc2 = page
2c790 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
2c7a0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
2c7b0 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
2c7c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c7d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c7e0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
2c7f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2c800 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2c810 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2c820 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
2c830 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
2c840 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2c850 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  eValid = 0;.    
2c860 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  }..    /* If an 
2c870 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
2c880 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
2c890 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
2c8a0 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
2c8b0 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  .    ** cache. S
2c8c0 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
2c8d0 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
2c8e0 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
2c8f0 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65  error .    ** pe
2c900 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f  rsistent..    */
2c910 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2c920 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2c930 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2c940 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2c950 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2c960 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2c970 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
2c980 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
2c990 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
2c9a0 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
2c9b0 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
2c9c0 75 38 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  u8 sqlite3PagerI
2c9d0 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
2c9e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2c9f0 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
2ca00 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
2ca10 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2ca20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2ca30 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
2ca40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
2ca50 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
2ca60 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2ca70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
2ca80 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
2ca90 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
2caa0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
2cab0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2cac0 73 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  s to the specifi
2cad0 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  ed page..*/.int 
2cae0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2caf0 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67 65 20  Refcount(DbPage 
2cb00 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
2cb10 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  n sqlite3PcacheP
2cb20 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67  ageRefcount(pPag
2cb30 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  e);.}..#ifdef SQ
2cb40 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
2cb50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2cb60 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
2cb70 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
2cb80 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
2cb90 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
2cba0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2cbb0 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
2cbc0 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74  ;.  a[0] = sqlit
2cbd0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2cbe0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2cbf0 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69  );.  a[1] = sqli
2cc00 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
2cc10 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2cc20 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71  he);.  a[2] = sq
2cc30 6c 69 74 65 33 50 63 61 63 68 65 47 65 74 43 61  lite3PcacheGetCa
2cc40 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
2cc50 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d  pPCache);.  a[3]
2cc60 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2cc70 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29 20 70  eValid ? (int) p
2cc80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20  Pager->dbSize : 
2cc90 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  -1;.  a[4] = pPa
2cca0 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
2ccb0 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
2ccc0 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
2ccd0 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
2cce0 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
2ccf0 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
2cd00 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
2cd10 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
2cd20 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
2cd30 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
2cd40 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
2cd50 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
2cd60 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2cd70 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a  rIsMemdb(Pager *
2cd80 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
2cd90 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e 64 69  n MEMDB;.}.#endi
2cda0 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  f../*.** Check t
2cdb0 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
2cdc0 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
2cdd0 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
2cde0 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
2cdf0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
2ce00 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
2ce10 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
2ce20 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
2ce30 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
2ce40 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
2ce50 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
2ce60 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2ce70 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
2ce80 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
2ce90 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
2cea0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2ceb0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
2cec0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2ced0 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
2cee0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
2cef0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
2cf00 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
2cf10 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
2cf20 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
2cf30 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
2cf40 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
2cf50 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2cf60 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
2cf70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2cf80 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
2cf90 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
2cfa0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2cfb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2cfc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cfd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2cfe0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2cff0 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
2d000 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
2d010 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2d020 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
2d030 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
2d040 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
2d050 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
2d060 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2d070 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2d0a0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2d0b0 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
2d0c0 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d0e0 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
2d0f0 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20  oint array */.. 
2d100 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
2d110 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20  re is no active 
2d120 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73  journal or the s
2d130 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  ub-journal is op
2d140 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  en or .    ** th
2d150 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  e journal is alw
2d160 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  ays stored in me
2d170 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65  mory */.    asse
2d180 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2d190 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f  epoint==0 || isO
2d1a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2d1b0 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
2d1c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d1d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2d1e0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
2d1f0 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
2d200 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
2d210 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20  int array using 
2d220 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72  realloc(). Retur
2d230 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
2d240 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
2d250 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f  ocation fails. O
2d260 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74  therwise, zero t
2d270 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69  he new portion i
2d280 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a  n case a .    **
2d290 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2d2a0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70  occurs while pop
2d2b0 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68  ulating it in th
2d2c0 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20  e for(...) loop 
2d2d0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
2d2e0 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53    aNew = (PagerS
2d2f0 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74  avepoint *)sqlit
2d300 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
2d310 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
2d320 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61  point, sizeof(Pa
2d330 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53  gerSavepoint)*nS
2d340 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a  avepoint.    );.
2d350 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
2d360 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d370 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2d380 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e  }.    memset(&aN
2d390 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c  ew[nCurrent], 0,
2d3a0 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75   (nSavepoint-nCu
2d3b0 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28  rrent) * sizeof(
2d3c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29  PagerSavepoint))
2d3d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
2d3e0 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b  avepoint = aNew;
2d3f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
2d400 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70  vepoint = nSavep
2d410 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  oint;..    /* Po
2d420 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72  pulate the Pager
2d430 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
2d440 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61  ures just alloca
2d450 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ted. */.    for(
2d460 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c  ii=nCurrent; ii<
2d470 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2d480 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2d490 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
2d4a0 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e  alid );.      aN
2d4b0 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70  ew[ii].nOrig = p
2d4c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2d4d0 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2d4e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
2d4f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d500 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>0 ){.        
2d510 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74  aNew[ii].iOffset
2d520 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
2d530 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  alOff;.      }el
2d540 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  se{.        aNew
2d550 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a  [ii].iOffset = J
2d560 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
2d570 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
2d580 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53       aNew[ii].iS
2d590 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  ubRec = pPager->
2d5a0 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61  nSubRec;.      a
2d5b0 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2d5c0 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  oint = sqlite3Bi
2d5d0 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
2d5e0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
2d5f0 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e    if( !aNew[ii].
2d600 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  pInSavepoint ){.
2d610 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d620 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2d630 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2d640 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
2d650 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
2d660 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
2d670 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ened. */.    rc 
2d680 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2d690 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
2d6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d6b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d6c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2d6d0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65  rollback or rele
2d6e0 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73  ase (commit) a s
2d6f0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65  avepoint..** The
2d700 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65   savepoint to re
2d710 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
2d720 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68  k need not be th
2d730 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
2d740 0a 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65  .** created save
2d750 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  point..**.** Par
2d760 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77  ameter op is alw
2d770 61 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50  ays either SAVEP
2d780 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
2d790 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
2d7a0 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  SE..** If it is 
2d7b0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2d7c0 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20  E, then release 
2d7d0 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20  and destroy the 
2d7e0 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a  savepoint with.*
2d7f0 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69  * index iSavepoi
2d800 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  nt. If it is SAV
2d810 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
2d820 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61   then rollback a
2d830 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  ll changes.** th
2d840 61 74 20 68 61 76 65 20 6f 63 63 75 72 65 64 20  at have occured 
2d850 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66  since the specif
2d860 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61  ied savepoint wa
2d870 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
2d880 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74   The savepoint t
2d890 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
2d8a0 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66  lease is identif
2d8b0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
2d8c0 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e   .** iSavepoint.
2d8d0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65   A value of 0 me
2d8e0 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ans to operate o
2d8f0 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  n the outermost 
2d900 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68  savepoint.** (th
2d910 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29  e first created)
2d920 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61  . A value of (Pa
2d930 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
2d940 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a  ) means operate.
2d950 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** on the most r
2d960 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
2d970 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53  savepoint. If iS
2d980 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
2d990 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67  ter than.** (Pag
2d9a0 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2d9b0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2d9c0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2d9d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61  .**.** If a nega
2d9e0 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61  tive value is pa
2d9f0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2da00 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ction, then the 
2da10 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2da20 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
2da30 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
2da40 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c  ifferent to call
2da50 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
2da60 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62  agerRollback() b
2da70 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
2da80 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65  tion does not te
2da90 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74  rminate.** the t
2daa0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e  ransaction or un
2dab0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
2dac0 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f  e, it just resto
2dad0 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  res the .** cont
2dae0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
2daf0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
2db00 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  inal state. .**.
2db10 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20  ** In any case, 
2db20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
2db30 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
2db40 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
2db50 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
2db60 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20  troyed. If this 
2db70 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65  is a release ope
2db80 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45  ration (op==SAVE
2db90 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a  POINT_RELEASE),.
2dba0 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e  ** then savepoin
2dbb0 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  t iSavepoint is 
2dbc0 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a  also destroyed..
2dbd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2dbe0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2dbf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2dc00 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2dc10 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20  on fails,.** or 
2dc20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2dc30 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
2dc40 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c  occurs while rol
2dc50 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20  ling back a .** 
2dc60 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f  savepoint. If no
2dc70 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53   errors occur, S
2dc80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2dc90 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  rned..*/ .int sq
2dca0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
2dcb0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
2dcc0 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
2dcd0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2dce0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2dcf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
2dd00 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
2dd10 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
2dd20 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
2dd30 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
2dd40 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53  oint>=0 || op==S
2dd50 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2dd60 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
2dd70 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
2dd80 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
2dd90 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2dda0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2ddb0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
2ddc0 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
2ddd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2dde0 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f  remaining savepo
2ddf0 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20  ints after this 
2de00 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  op. */..    /* F
2de10 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
2de20 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ny savepoints wi
2de30 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69  ll still be acti
2de40 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20  ve after this.  
2de50 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
2de60 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65  Store this value
2de70 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66   in nNew. Then f
2de80 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73  ree resources as
2de90 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a  sociated .    **
2dea0 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f   with any savepo
2deb0 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65  ints that are de
2dec0 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20  stroyed by this 
2ded0 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
2dee0 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61  /.    nNew = iSa
2def0 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53  vepoint + (op==S
2df00 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2df10 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e  K);.    for(ii=n
2df20 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  New; ii<pPager->
2df30 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2df40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2df50 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
2df60 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2df70 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2df80 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
2df90 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2dfa0 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = nNew;..    /*
2dfb0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f   If this is a ro
2dfc0 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
2dfd0 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73  , playback the s
2dfe0 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69  pecified savepoi
2dff0 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  nt..    ** If th
2e000 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  is is a temp-fil
2e010 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  e, it is possibl
2e020 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
2e030 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20  al file has.    
2e040 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
2e050 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
2e060 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20  case there have 
2e070 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
2e080 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
2e090 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20  tabase file, so 
2e0a0 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  the playback ope
2e0b0 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b  ration can be sk
2e0c0 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ipped..    */.  
2e0d0 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
2e0e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20  INT_ROLLBACK && 
2e0f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2e100 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  fd) ){.      Pag
2e110 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
2e120 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d  vepoint = (nNew=
2e130 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61  =0)?0:&pPager->a
2e140 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31  Savepoint[nNew-1
2e150 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ];.      rc = pa
2e160 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
2e170 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61  oint(pPager, pSa
2e180 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
2e190 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54  assert(rc!=SQLIT
2e1a0 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20  E_DONE);.    }. 
2e1b0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
2e1c0 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66   is a release of
2e1d0 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2e1e0 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61  avepoint, trunca
2e1f0 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  te .    ** the s
2e200 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65  ub-journal to ze
2e210 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
2e220 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65  . */.    if( nNe
2e230 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45  w==0 && op==SAVE
2e240 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26  POINT_RELEASE &&
2e250 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2e260 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  sjfd) ){.      a
2e270 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2e280 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63  E_OK );.      rc
2e290 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
2e2a0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  cate(pPager->sjf
2e2b0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  d, 0);.      pPa
2e2c0 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
2e2d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2e2e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e2f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2e300 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2e310 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2e320 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2e330 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
2e340 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
2e350 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2e360 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
2e370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e380 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
2e390 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
2e3a0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
2e3b0 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
2e3c0 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
2e3d0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2e3e0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
2e3f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2e400 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
2e410 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2e420 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
2e430 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
2e440 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
2e450 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
2e460 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
2e470 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2e480 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
2e490 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
2e4a0 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
2e4b0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2e4c0 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
2e4d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
2e4e0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
2e4f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2e500 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2e510 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
2e520 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
2e530 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2e540 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2e550 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
2e560 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
2e570 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
2e580 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
2e590 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
2e5a0 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
2e5b0 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
2e5c0 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
2e5d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
2e5e0 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
2e5f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2e600 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
2e610 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
2e620 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65  S_CODEC./*.** Se
2e630 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
2e640 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
2e650 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
2e660 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
2e670 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
2e680 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
2e690 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
2e6a0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
2e6b0 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
2e6c0 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
2e6d0 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
2e6e0 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
2e6f0 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  rg;.}.#endif..#i
2e700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e710 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
2e720 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
2e730 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e   pPg to location
2e740 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
2e750 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  e..**.** There m
2e760 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
2e770 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2e780 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
2e790 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28  ted at.** pgno (
2e7a0 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50  which we call pP
2e7b0 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61  gOld) though tha
2e7c0 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65  t page is allowe
2e7d0 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61  d to be.** in ca
2e7e0 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  che.  If the pag
2e7f0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
2e800 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
2e810 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
2e820 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
2e830 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
2e840 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
2e850 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
2e860 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
2e870 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
2e880 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
2e890 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
2e8a0 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
2e8b0 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
2e8c0 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
2e8d0 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
2e8e0 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
2e8f0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
2e900 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
2e910 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2e920 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
2e930 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
2e940 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
2e950 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2e960 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
2e970 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
2e980 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
2e990 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
2e9a0 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
2e9b0 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
2e9c0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
2e9d0 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
2e9e0 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
2e9f0 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
2ea00 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
2ea10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ea20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  active)..**.** I
2ea30 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  f the fourth arg
2ea40 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c  ument, isCommit,
2ea50 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2ea60 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
2ea70 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61  being.** moved a
2ea80 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61  s part of a data
2ea90 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74  base reorganizat
2eaa0 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ion just before 
2eab0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2eac0 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  .** is being com
2ead0 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20  mitted. In this 
2eae0 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72  case, it is guar
2eaf0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
2eb00 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a  database page .*
2eb10 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20  * pPg refers to 
2eb20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
2eb30 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74  ten to again wit
2eb40 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
2eb50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
2eb60 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2eb70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2eb80 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
2eb90 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
2eba0 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68  r.** occurs. Oth
2ebb0 65 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72  erwise, it retur
2ebc0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
2ebd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2ebe0 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
2ebf0 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
2ec00 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pPg, Pgno pgno,
2ec10 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a   int isCommit){.
2ec20 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ec40 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
2ec50 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
2ec60 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
2ec70 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Pgno = 0;       
2ec80 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20  /* Old value of 
2ec90 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79  pPg->pgno, if sy
2eca0 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a  nc is required *
2ecb0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecd0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2ece0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
2ecf0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
2ed00 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62  /* If the page b
2ed10 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69  eing moved is di
2ed20 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20  rty and has not 
2ed30 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68  been saved by th
2ed40 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61  e latest.  ** sa
2ed50 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61  vepoint, then sa
2ed60 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
2ed70 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2ed80 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  age into the .  
2ed90 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e  ** sub-journal n
2eda0 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  ow. This is requ
2edb0 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
2edc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
2edd0 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nario:.  **.  **
2ede0 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
2edf0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
2ee00 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20   X, then modify 
2ee10 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20  it in memory>.  
2ee20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
2ee30 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20   one;.  **      
2ee40 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f   <Move page X to
2ee50 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a   location Y>.  *
2ee60 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
2ee70 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  O one;.  **.  **
2ee80 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20   If page X were 
2ee90 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
2eea0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68  he sub-journal h
2eeb0 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ere, it would no
2eec0 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62  t.  ** be possib
2eed0 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74  le to restore it
2eee0 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20  s contents when 
2eef0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
2ef00 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65   one".  ** state
2ef10 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f  ment were is pro
2ef20 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  cessed..  **.  *
2ef30 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  * subjournalPage
2ef40 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61  () may need to a
2ef50 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
2ef60 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
2ef70 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f   into.  ** one o
2ef80 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
2ef90 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 69   bitvecs. This i
2efa0 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69  s the reason thi
2efb0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
2efc0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2efd0 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20  E_NOMEM..  */.  
2efe0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2eff0 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26  GHDR_DIRTY .   &
2f000 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
2f010 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51  ge(pPg).   && SQ
2f020 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2f030 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2f040 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  g)).  ){.    ret
2f050 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
2f060 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45  AGERTRACE(("MOVE
2f070 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
2f080 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
2f090 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
2f0a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2f0b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50  , pPg->pgno, (pP
2f0c0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2f0d0 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70  EED_SYNC)?1:0, p
2f0e0 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  gno));.  IOTRACE
2f0f0 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
2f100 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
2f110 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
2f120 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
2f130 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
2f140 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
2f150 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63  page pPg->pgno c
2f160 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  an.  ** be writt
2f170 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67  en to, store pPg
2f180 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20  ->pgno in local 
2f190 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e  variable needSyn
2f1a0 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cPgno..  **.  **
2f1b0 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74   If the isCommit
2f1c0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
2f1d0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
2f1e0 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
2f1f0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
2f200 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
2f210 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
2f220 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e  abase page pPg->
2f230 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62  pgno .  ** can b
2f240 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
2f250 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
2f260 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
2f270 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74  t to write to it
2f280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ..  */.  if( (pP
2f290 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2f2a0 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73  EED_SYNC) && !is
2f2b0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65  Commit ){.    ne
2f2c0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
2f2d0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
2f2e0 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
2f2f0 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
2f300 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
2f310 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  igSize );.    as
2f320 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
2f330 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
2f340 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f350 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
2f360 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2f370 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
2f380 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
2f390 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
2f3a0 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
2f3b0 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
2f3c0 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
2f3d0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
2f3e0 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
2f3f0 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
2f400 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
2f410 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
2f420 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
2f430 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
2f440 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
2f450 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
2f460 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
2f470 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d  SYNC;.  pPgOld =
2f480 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
2f490 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
2f4a0 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c  ssert( !pPgOld |
2f4b0 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  | pPgOld->nRef==
2f4c0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  1 );.  if( pPgOl
2f4d0 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c  d ){.    pPg->fl
2f4e0 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e  ags |= (pPgOld->
2f4f0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2f500 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a 20 20 73  _SYNC);.  }..  s
2f510 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65  qlite3PcacheMove
2f520 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  (pPg, pgno);.  i
2f530 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
2f540 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
2f550 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a  op(pPgOld);.  }.
2f560 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2f570 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
2f580 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
2f590 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28  fied = 1;..  if(
2f5a0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
2f5b0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
2f5c0 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
2f5d0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
2f5e0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
2f5f0 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
2f600 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
2f610 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
2f620 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
2f630 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
2f640 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
2f650 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
2f660 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
2f670 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
2f680 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  nd the .    ** "
2f690 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69  is journaled" bi
2f6a0 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65  tvec flag has be
2f6b0 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
2f6c0 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
2f6d0 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64  d by.    ** load
2f6e0 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74  ing the page int
2f6f0 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
2f700 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
2f710 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
2f720 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20   .    ** flag.. 
2f730 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2f740 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  the attempt to l
2f750 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74  oad the page int
2f760 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
2f770 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20   fails, (due.   
2f780 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28   ** to a malloc(
2f790 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29  ) or IO failure)
2f7a0 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20  , clear the bit 
2f7b0 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61  in the pInJourna
2f7c0 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79  l[].    ** array
2f7d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
2f7e0 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64  the page is load
2f7f0 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61  ed and written a
2f800 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74  gain in.    ** t
2f810 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
2f820 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74   it may be writt
2f830 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
2f840 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20  se file before. 
2f850 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63     ** it is sync
2f860 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ed into the jour
2f870 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77  nal file. This w
2f880 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75  ay, it may end u
2f890 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  p in.    ** the 
2f8a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69  journal file twi
2f8b0 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  ce, but that is 
2f8c0 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20  not a problem.. 
2f8d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2f8e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2f8f0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
2f900 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
2f910 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
2f920 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
2f930 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
2f940 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
2f950 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20     */.    PgHdr 
2f960 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73  *pPgHdr;.    ass
2f970 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
2f980 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
2f990 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2f9a0 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
2f9b0 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29  ncPgno, &pPgHdr)
2f9c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2f9d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f9e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
2f9f0 4a 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64 53  Journal && needS
2fa00 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
2fa10 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
2fa20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
2fa30 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
2fa40 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
2fa50 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20  edSyncPgno);.   
2fa60 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2fa70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2fa80 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2fa90 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74   = 1;.    assert
2faa0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2fab0 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  ==0 && !MEMDB );
2fac0 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61  .    pPgHdr->fla
2fad0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
2fae0 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74  _SYNC;.    sqlit
2faf0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
2fb00 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
2fb10 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2fb20 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
2fb30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2fb40 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
2fb50 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2fb60 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
2fb70 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
2fb80 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
2fb90 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
2fba0 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
2fbb0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
2fbc0 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d  ->nRef>0 || pPg-
2fbd0 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
2fbe0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
2fbf0 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pData;.}../*.** 
2fc00 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2fc10 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
2fc20 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
2fc30 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
2fc40 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
2fc50 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
2fc60 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
2fc70 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
2fc80 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
2fc90 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2fca0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2fcb0 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  er;.  return (pP
2fcc0 61 67 65 72 3f 70 50 67 2d 3e 70 45 78 74 72 61  ager?pPg->pExtra
2fcd0 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  :0);.}../*.** Ge
2fce0 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
2fcf0 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
2fd00 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
2fd10 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
2fd20 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
2fd30 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
2fd40 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
2fd50 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
2fd60 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
2fd70 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
2fd80 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
2fd90 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
2fda0 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
2fdb0 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
2fdc0 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
2fdd0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
2fde0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
2fdf0 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
2fe00 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2fe10 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
2fe20 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2fe30 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
2fe40 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
2fe50 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
2fe60 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
2fe70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2fe80 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
2fe90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2fea0 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
2feb0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
2fec0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
2fed0 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
2fee0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
2fef0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2ff00 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
2ff10 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
2ff20 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2ff30 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2ff40 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2ff50 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
2ff60 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2ff70 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2ff80 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
2ff90 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2ffa0 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
2ffb0 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
2ffc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
2ffd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
2ffe0 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2fff0 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65  )eMode;.  }.  re
30000 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
30010 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  ->exclusiveMode;
30020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
30030 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  t the journal-mo
30040 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
30050 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
30060 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  de must be one o
30070 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45  f:.**.**    PAGE
30080 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
30090 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ERY.**    PAGER_
300a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
300b0 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  TE.**    PAGER_J
300c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
300d0 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ATE.**    PAGER_
300e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
300f0 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  IST.**    PAGER_
30100 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a  JOURNALMODE_OFF.
30110 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
30120 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a  NALMODE_MEMORY.*
30130 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61  *.** If the para
30140 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
30150 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ERY, then the jo
30160 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65  urnal-mode is se
30170 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75  t to the.** valu
30180 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
30190 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
301a0 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72  indicate the cur
301b0 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
301c0 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d  pdated) journal-
301d0 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
301e0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
301f0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
30200 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
30210 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
30220 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64      assert( eMod
30230 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
30240 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
30250 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
30260 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
30270 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
30280 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
30290 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
302a0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
302b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
302c0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
302d0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
302e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
302f0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
30300 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
30310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
30320 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
30330 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
30340 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30350 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30360 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 20  E_QUERY<0 );.   
30370 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b   if( eMode>=0 ){
30380 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
30390 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38  ournalMode = (u8
303a0 29 65 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73  )eMode;.    }els
303b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
303c0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
303d0 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20  URNALMODE_QUERY 
303e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
303f0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
30400 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
30410 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
30420 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
30430 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
30440 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
30450 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  s..*/.i64 sqlite
30460 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
30470 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  eLimit(Pager *pP
30480 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74  ager, i64 iLimit
30490 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  ){.  if( iLimit>
304a0 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =-1 ){.    pPage
304b0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
304c0 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20  mit = iLimit;.  
304d0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
304e0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
304f0 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  mit;.}..#endif /
30500 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
30510 53 4b 49 4f 20 2a 2f 0a                          SKIO */.