/ Hex Artifact Content
Login

Artifact e8d7bb38b017f69592ef60c29e079e98116e9169:


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 38  : pager.c,v 1.58
0350: 39 20 32 30 30 39 2f 30 35 2f 32 39 20 31 30 3a  9 2009/05/29 10:
0360: 35 35 3a 33 30 20 64 72 68 20 45 78 70 20 24 0a  55:30 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
03f0: 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b 20 20  3PagerTrace=1;  
0400: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
0410: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 64 65  e tracing */.#de
0420: 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75  fine sqlite3Debu
0430: 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a 23  gPrintf printf.#
0440: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0450: 45 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c  E(X)     if( sql
0460: 69 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29  ite3PagerTrace )
0470: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
0480: 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73 65 0a  intf X; }.#else.
0490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04a0: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
04b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
04c0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
04d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
04e0: 20 50 41 47 45 52 54 52 41 43 45 28 29 20 6d 61   PAGERTRACE() ma
04f0: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0500: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0510: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0520: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0530: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0540: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
0550: 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e  as its argument.
0560: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0570: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0580: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0590: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
05a0: 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f  akes an sqlite3_
05b0: 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  file.** struct a
05c0: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a  s its argument..
05d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
05e0: 49 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e  ID(p) ((int)(p->
05f0: 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c  fd)).#define FIL
0600: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28  EHANDLEID(fd) ((
0610: 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54  int)fd)../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0870: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0880: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0890: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  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 62 75 74 20 68 61 73 20 6e 6f 74       but has not
08c0: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
08d0: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
08e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0910: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0920: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0930: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0950: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0960: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0970: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
09a0: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
09b0: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
09e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
09f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0a00: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0a10: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0a20: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0a50: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0a60: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a80: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0a90: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0aa0: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0ab0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0ad0: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0af0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0b00: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0b10: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0b30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b40: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0b50: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0ba0: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0bb0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0bc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bd0: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0be0: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0bf0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0c00: 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  e or.**         
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0c20: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
0c70: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0c80: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0c90: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0ca0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0cb0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0cc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0d90: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0da0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0db0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0dc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0dd0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0de0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0df0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0e00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0e10: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0e20: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0e30: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0e40: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0e50: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0e60: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e70: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0e80: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0e90: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
0ea0: 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c   is an open roll
0eb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
0ec0: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0ed0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0ee0: 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65  VE occurs before
0ef0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
0f00: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
0f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
0f20: 68 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20  hough writes to 
0f30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
0f40: 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77  journal occurs w
0f50: 69 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52  ith just PAGER_R
0f60: 45 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20  ESERVED.  After 
0f70: 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  an sqlite3PagerR
0f80: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
0f90: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
0fa0: 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68  itPhaseTwo(), th
0fb0: 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62  e state can go b
0fc0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
0fd0: 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61  RED,.** or it ca
0fe0: 6e 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f  n stay at PAGER_
0ff0: 45 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20  EXCLUSIVE if we 
1000: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
1010: 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f   access mode..*/
1020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
1030: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
1040: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
1050: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
1060: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
1070: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1080: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1090: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
10a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
10b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
10c0: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
10d0: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
10e0: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
10f0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1100: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d      5../*.** A m
1110: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1120: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1130: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1140: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1150: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1160: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1170: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
1180: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
1190: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
11a0: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
11b0: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
11c0: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
11d0: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
11e0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
11f0: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
1200: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
1210: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
1220: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
1230: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
1240: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
1250: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
1260: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74  mum allowed sect
1270: 6f 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49  or size. 16MB. I
1280: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
1290: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
12a0: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
12b0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
12c0: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
12d0: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
12e0: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
12f0: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
1300: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
1310: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
1320: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
1330: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
1340: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
1350: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
1360: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
1370: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
1380: 53 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a 0a  SIZE 0x0100000..
1390: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
13a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
13b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
13c0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
13d0: 63 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76  ch active.** sav
13e0: 65 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65  epoint and state
13f0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1400: 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20   in the system. 
1410: 41 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75  All such structu
1420: 72 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  res.** are store
1430: 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  d in the Pager.a
1440: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
1450: 79 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f  y, which is allo
1460: 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73  cated and.** res
1470: 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ized using sqlit
1480: 65 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a  e3Realloc()..**.
1490: 2a 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  ** When a savepo
14a0: 69 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c 20  int is created, 
14b0: 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
14c0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
14d0: 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  eld is.** set to
14e0: 20 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   0. If a journal
14f0: 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
1500: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  en into the main
1510: 20 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a   journal while.*
1520: 2a 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * the savepoint 
1530: 69 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20  is active, then 
1540: 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  iHdrOffset is se
1550: 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66  t to the byte of
1560: 66 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61  fset .** immedia
1570: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
1580: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20  he last journal 
1590: 72 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69  record written i
15a0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  nto the main.** 
15b0: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74  journal before t
15c0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
15d0: 72 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  r. This is requi
15e0: 72 65 64 20 64 75 72 69 6e 67 20 73 61 76 65 70  red during savep
15f0: 6f 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  oint.** rollback
1600: 20 28 73 65 65 20 70 61 67 65 72 50 6c 61 79 62   (see pagerPlayb
1610: 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e  ackSavepoint()).
1620: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1630: 63 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ct PagerSavepoin
1640: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1650: 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 53 61  ;.struct PagerSa
1660: 76 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20  vepoint {.  i64 
1670: 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  iOffset;        
1680: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
1690: 74 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d  ting offset in m
16a0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
16b0: 20 69 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b   i64 iHdrOffset;
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d0: 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20   See above */.  
16e0: 42 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70  Bitvec *pInSavep
16f0: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  oint;        /* 
1700: 53 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  Set of pages in 
1710: 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a  this savepoint *
1720: 2f 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20  /.  Pgno nOrig; 
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d   /* Original num
1750: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1760: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  file */.  Pgno i
1770: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
1780: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1790: 6f 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 20  of first record 
17a0: 69 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  in sub-journal *
17b0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  /.};../*.** A op
17c0: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
17d0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
17e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
17f0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65  ructure..**.** e
1800: 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50  rrCode.**.**   P
1810: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79  ager.errCode may
1820: 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
1830: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
1840: 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20  CORRUPT, or.**  
1850: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e   or SQLITE_FULL.
1860: 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65   Once one of the
1870: 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72   first three err
1880: 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70  ors occurs, it p
1890: 65 72 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64  ersists.**   and
18a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
18b0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76  the result of ev
18c0: 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20  ery major pager 
18d0: 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a  API call.  The.*
18e0: 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  *   SQLITE_FULL 
18f0: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
1900: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
1910: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
1920: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
1930: 20 20 20 6e 65 78 74 20 73 75 63 63 65 73 73 66     next successf
1940: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
1950: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
1960: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
1970: 6f 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46  o,.**   SQLITE_F
1980: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
1990: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
19a0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
19b0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
19c0: 28 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68  ().**   APIs, th
19d0: 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ey may still be 
19e0: 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  used successfull
19f0: 79 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56  y..**.** dbSizeV
1a00: 61 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62  alid, dbSize, db
1a10: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
1a20: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e  Size.**.**   Man
1a30: 61 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f  aging the size o
1a40: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a50: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73 20  ile in pages is 
1a60: 61 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63  a little complic
1a70: 61 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76  ated..**   The v
1a80: 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62  ariable Pager.db
1a90: 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Size contains th
1aa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1ab0: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
1ac0: 61 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63  ase.**   image c
1ad0: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
1ae0: 73 2e 20 41 73 20 74 68 65 20 64 61 74 61 62 61  s. As the databa
1af0: 73 65 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f  se image grows o
1b00: 72 20 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a  r shrinks this.*
1b10: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 69 73 20  *   variable is 
1b20: 75 70 64 61 74 65 64 2e 20 54 68 65 20 76 61 72  updated. The var
1b30: 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69  iable Pager.dbFi
1b40: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
1b50: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  the number.**   
1b60: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1b80: 68 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65  his may be diffe
1b90: 72 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e  rent from Pager.
1ba0: 64 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73  dbSize.**   if s
1bb0: 6f 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62  ome pages have b
1bc0: 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20  een appended to 
1bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
1be0: 67 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77  ge but not yet w
1bf0: 72 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20  ritten.**   out 
1c00: 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74  from the cache t
1c10: 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  o the actual fil
1c20: 65 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66  e on disk. Or if
1c30: 20 74 68 65 20 69 6d 61 67 65 20 68 61 73 20 62   the image has b
1c40: 65 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74  een.**   truncat
1c50: 65 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65  ed by an increme
1c60: 6e 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72  ntal-vacuum oper
1c70: 61 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72  ation. The Pager
1c80: 2e 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69  .dbOrigSize vari
1c90: 61 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69  able.**   contai
1ca0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1cb0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1cc0: 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 68 65  tabase image whe
1cd0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
1ce0: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77     transaction w
1cf0: 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63  as opened. The c
1d00: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74  ontents of all t
1d10: 68 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61  hree of these va
1d20: 72 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20  riables is.**   
1d30: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20  only guaranteed 
1d40: 74 6f 20 62 65 20 63 6f 72 72 65 63 74 20 69 66  to be correct if
1d50: 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67   the boolean Pag
1d60: 65 72 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69  er.dbSizeValid i
1d70: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  s true..**.**   
1d80: 54 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74  TODO: Under what
1d90: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64   conditions is d
1da0: 62 53 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20  bSizeValid set? 
1db0: 43 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63  Cleared?.**.** c
1dc0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a  hangeCountDone.*
1dd0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c  *.**   This bool
1de0: 65 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20  ean variable is 
1df0: 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
1e00: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 67  e that the chang
1e10: 65 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20  e-counter .**   
1e20: 28 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64  (the 4-byte head
1e30: 65 72 20 66 69 65 6c 64 20 61 74 20 62 79 74 65  er field at byte
1e40: 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
1e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1e60: 20 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70   is .**   not up
1e70: 64 61 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e  dated more often
1e80: 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e   than necessary.
1e90: 20 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20   .**.**   It is 
1ea0: 73 65 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e  set to true when
1eb0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1ec0: 74 65 72 20 66 69 65 6c 64 20 69 73 20 75 70 64  ter field is upd
1ed0: 61 74 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20  ated, which .** 
1ee0: 20 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65    can only happe
1ef0: 6e 20 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76  n if an exclusiv
1f00: 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
1f10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1f20: 69 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20  ile..**   It is 
1f30: 63 6c 65 61 72 65 64 20 28 73 65 74 20 74 6f 20  cleared (set to 
1f40: 66 61 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20  false) whenever 
1f50: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1f60: 6b 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e  k is .**   relin
1f70: 71 75 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64  quished on the d
1f80: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61  atabase file. Ea
1f90: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
1fa0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
1fb0: 65 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61  ed,.**   The cha
1fc0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1fd0: 67 20 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20  g is inspected. 
1fe0: 49 66 20 69 74 20 69 73 20 74 72 75 65 2c 20 74  If it is true, t
1ff0: 68 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20  he work of.**   
2000: 75 70 64 61 74 69 6e 67 20 74 68 65 20 63 68 61  updating the cha
2010: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f  nge-counter is o
2020: 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 20 63  mitted for the c
2030: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2040: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  on..**.**   This
2050: 20 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73   mechanism means
2060: 20 74 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69   that when runni
2070: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
2080: 6d 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69  mode, a connecti
2090: 6f 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e  on .**   need on
20a0: 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ly update the ch
20b0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63  ange-counter onc
20c0: 65 2c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  e, for the first
20d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
20e0: 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a    committed..**.
20f0: 2a 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a  ** dbModified.**
2100: 0a 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69  .**   The dbModi
2110: 66 69 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  fied flag is set
2120: 20 77 68 65 6e 65 76 65 72 20 61 20 64 61 74 61   whenever a data
2130: 62 61 73 65 20 70 61 67 65 20 69 73 20 64 69 72  base page is dir
2140: 74 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73  tied..**   It is
2150: 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 65 20   cleared at the 
2160: 65 6e 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e  end of each tran
2170: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2180: 20 49 74 20 69 73 20 75 73 65 64 20 77 68 65 6e   It is used when
2190: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f   committing or o
21a0: 74 68 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20  therwise ending 
21b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
21c0: 66 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64  f.**   the dbMod
21d0: 69 66 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c  ified flag is cl
21e0: 65 61 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f  ear then less wo
21f0: 72 6b 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e  rk has to be don
2200: 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e..**.** journal
2210: 53 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20  Started.**.**   
2220: 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74  This flag is set
2230: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68   whenever the th
2240: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  e main journal i
2250: 73 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  s synced. .**.**
2260: 20 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20     The point of 
2270: 74 68 69 73 20 66 6c 61 67 20 69 73 20 74 68 61  this flag is tha
2280: 74 20 69 74 20 6d 75 73 74 20 62 65 20 73 65 74  t it must be set
2290: 20 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20   after the .**  
22a0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
22b0: 65 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e  eader in a journ
22c0: 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
22d0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
22e0: 0a 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69 73  .**   After this
22f0: 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e   has happened, n
2300: 65 77 20 70 61 67 65 73 20 61 70 70 65 6e 64 65  ew pages appende
2310: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2320: 65 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e  e .**   do not n
2330: 65 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45  eed the PGHDR_NE
2340: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74  ED_SYNC flag set
2350: 2c 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74  , as they do not
2360: 20 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61   need.**   to wa
2370: 69 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c  it for a journal
2380: 20 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65   sync before the
2390: 79 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  y can be written
23a0: 20 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65   out to.**   the
23b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
23c0: 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67  see function pag
23d0: 65 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20  er_write())..** 
23e0: 20 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a    .** setMaster.
23f0: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72  **.**   This var
2400: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2410: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
2420: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2430: 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28  file name.**   (
2440: 69 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20  if any) is only 
2450: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
2470: 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ce..**.**   When
2480: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
2490: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d  ansaction, the m
24a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
24b0: 6c 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29  le name (if any)
24c0: 0a 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69  .**   may be wri
24d0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
24e0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65  urnal file while
24f0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74   the pager is st
2500: 69 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45  ill in.**   PAGE
2510: 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2520: 20 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73   (see CommitPhas
2530: 65 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61  eOne() for the a
2540: 63 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20  ction). It.**   
2550: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  then attempts to
2560: 20 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65   upgrade to an e
2570: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49  xclusive lock. I
2580: 66 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a  f this attempt.*
2590: 2a 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  *   fails, then 
25a0: 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20  SQLITE_BUSY may 
25b0: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  be returned to t
25c0: 68 65 20 75 73 65 72 20 61 6e 64 20 74 68 65 20  he user and the 
25d0: 75 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74  user.**   may at
25e0: 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20  tempt to commit 
25f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2600: 61 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c  again later (cal
2610: 6c 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74  ling.**   Commit
2620: 50 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e  PhaseOne() again
2630: 29 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73 20  ). This flag is 
2640: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
2650: 68 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61  hat the .**   ma
2660: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
2670: 65 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65  e is only writte
2680: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2690: 20 66 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a   file the first.
26a0: 2a 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74  **   time Commit
26b0: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
26c0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f  lled..**.** doNo
26d0: 74 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tSync.**.**   Th
26e0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  is variable is s
26f0: 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  et and cleared b
2700: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
2710: 69 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65  ite()..**.** nee
2720: 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  dSync.**.**   TO
2730: 44 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20  DO: It might be 
2740: 65 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68  easier to set th
2750: 69 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77  is variable in w
2760: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
2770: 0a 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d  .**   and writeM
2780: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f  asterJournal() o
2790: 6e 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20  nly. Change its 
27a0: 6d 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79  meaning to "unsy
27b0: 6e 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68  nced data.**   h
27c0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
27d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e  to the journal".
27e0: 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d  .**.** subjInMem
27f0: 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ory.**.**   This
2800: 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   is a boolean va
2810: 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c  riable. If true,
2820: 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
2830: 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  ed sub-journal.*
2840: 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73  *   is opened as
2850: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
2860: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66  urnal file. If f
2870: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65  alse, then in-me
2880: 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f  mory.**   sub-jo
2890: 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20  urnals are only 
28a0: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
28b0: 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a  ry pager files..
28c0: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
28d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
28e0: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
28f0: 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20  /* OS functions 
2900: 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f  to use for IO */
2910: 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d  .  u8 exclusiveM
2920: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
2930: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20  * Boolean. True 
2940: 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  if locking_mode=
2950: 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20  =EXCLUSIVE */.  
2960: 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20  u8 journalMode; 
2970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2980: 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  n of the PAGER_J
2990: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
29a0: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
29b0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
29c0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
29d0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
29e0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
29f0: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a10: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2a20: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2a30: 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  s */.  u8 noSync
2a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a50: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
2a60: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
2a70: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
2a80: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
2a90: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
2aa0: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
2ab0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
2ac0: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73  stness */.  u8 s
2ad0: 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20  ync_flags;      
2ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2af0: 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  f SYNC_NORMAL or
2b00: 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20   SYNC_FULL */.  
2b10: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2b30: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
2b40: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
2b50: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b70: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
2b80: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
2b90: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
2bc0: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
2bd0: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
2be0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
2bf0: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
2c00: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61  s members that a
2c10: 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  re dynamically. 
2c20: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72   ** modified dur
2c30: 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  ing normal opera
2c40: 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72  tions. The other
2c50: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
2c60: 69 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  is structure.  *
2c70: 2a 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e  * are either con
2c80: 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74  stant throughout
2c90: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
2ca0: 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65   the pager, or e
2cb0: 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f  lse.  ** used to
2cc0: 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61   store configura
2cd0: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20  tion parameters 
2ce0: 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20  that affect the 
2cf0: 77 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20  way the pager . 
2d00: 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20   ** operates..  
2d10: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61  **.  ** The 'sta
2d20: 74 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20  te' variable is 
2d30: 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72  described in mor
2d40: 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77  e detail along w
2d50: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  ith the.  ** des
2d60: 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65  criptions of the
2d70: 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74   values it may t
2d80: 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f  ake - PAGER_UNLO
2d90: 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20  CK etc. Many of 
2da0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76  the.  ** other v
2db0: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73  ariables in this
2dc0: 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72   block are descr
2dd0: 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ibed in the comm
2de0: 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20  ent directly .  
2df0: 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c  ** above this cl
2e00: 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  ass definition..
2e10: 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b    */.  u8 state;
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
2e40: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
2e50: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
2e60: 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b    u8 dbModified;
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e80: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61   True if there a
2e90: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  re any changes t
2ea0: 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38  o the Db */.  u8
2eb0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
2ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ed0: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
2ee0: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
2ef0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
2f00: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
2f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f20: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
2f30: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2f40: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
2f50: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
2f60: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
2f70: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2f80: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
2f90: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
2fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fb0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
2fc0: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
2fd0: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
2fe0: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3000: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3010: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3020: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
3030: 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c  /.  u8 dbSizeVal
3040: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3050: 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69  /* Set when dbSi
3060: 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f  ze is correct */
3070: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
3080: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
3090: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
30a0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
30b0: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
30c0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
30d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30e0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
30f0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
3100: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
3120: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
3130: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
3140: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
3150: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
3160: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3170: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
3180: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
3190: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31b0: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
31c0: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
31d0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
3200: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
3210: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
3220: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
3230: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
3240: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
3250: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
3260: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
3270: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
32a0: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
32b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
32c0: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
32d0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
32e0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
32f0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
3300: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3310: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
3320: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
3330: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
3340: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
3350: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
3360: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
3370: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
3380: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
3390: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
33a0: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
33b0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
33c0: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
33d0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
33e0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
33f0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
3400: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
3410: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3420: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
3430: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
3440: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
3450: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
3460: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
3470: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
3480: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
3490: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
34a0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
34b0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34d0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
34e0: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
34f0: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
3500: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
3510: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
3520: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
3530: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
3540: 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a  .  u32 sectorSiz
3550: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
3560: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
3570: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
3580: 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 69 6e 74 20  lback */..  int 
3590: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
35a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
35b0: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
35c0: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
35d0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76   page */.  u32 v
35e0: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
35f0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
3600: 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  for sqlite3_vfs.
3610: 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  xOpen() */.  int
3620: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
3630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3640: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
3650: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
3660: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
3670: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3680: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
3690: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
36a0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
36b0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
36c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
36d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
36e0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
36f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3700: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
3710: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
3720: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
3730: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
3740: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
3750: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
3760: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
3770: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
3780: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
3790: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
37a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
37b0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
37c0: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
37d0: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
37e0: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
37f0: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
3800: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
3810: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
3820: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
3830: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
3840: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
3850: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
3860: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
3870: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
3880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3890: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
38a0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
38b0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
38c0: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
38d0: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
38e0: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
38f0: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
3900: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
3910: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
3920: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  ) */.#endif.  ch
3930: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3950: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
3960: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
3970: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36 34 20  mp use */.  i64 
3980: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
3990: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
39a0: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
39b0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
39c0: 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  es */.  PCache *
39d0: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
39e0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
39f0: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
3a00: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
3a10: 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
3a20: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
3a30: 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69  to list of ongoi
3a40: 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ng backup proces
3a50: 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
3a60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
3a70: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
3a80: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
3a90: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
3aa0: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
3ab0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
3ac0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
3ad0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
3ae0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
3af0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
3b00: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
3b10: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3b20: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
3b30: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
3b40: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
3b50: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
3b60: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
3b70: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
3b80: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
3b90: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
3ba0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
3bb0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
3bc0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
3bd0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
3be0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
3bf0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
3c00: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
3c10: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
3c20: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
3c30: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3c40: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
3c50: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
3c60: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
3c70: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
3c80: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
3c90: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
3ca0: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
3cb0: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
3cc0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
3cd0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
3ce0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
3cf0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
3d00: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
3d10: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
3d20: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
3d30: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3d40: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
3d50: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
3d60: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
3d70: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
3d80: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
3d90: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
3da0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
3db0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
3dc0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
3dd0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
3de0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
3df0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
3e00: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
3e10: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
3e20: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
3e30: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
3e40: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
3e50: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
3e60: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
3e70: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
3e80: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3e90: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
3ea0: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
3eb0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3ec0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
3ed0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3ee0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
3ef0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
3f00: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
3f10: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
3f20: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
3f30: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
3f40: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
3f50: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
3f60: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
3f70: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
3f80: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
3f90: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3fa0: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3fb0: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3fc0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3fd0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3fe0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3ff0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
4000: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
4010: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
4020: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
4030: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
4040: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
4050: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
4060: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
4070: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
4080: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
4090: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
40a0: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
40b0: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
40c0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
40d0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
40e0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
40f0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
4100: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
4110: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
4120: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
4130: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
4140: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
4150: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
4160: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
4170: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
4180: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
4190: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
41a0: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
41b0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
41c0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
41d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
41e0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
41f0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
4200: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
4210: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
4220: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
4230: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
4240: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
4250: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
4260: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
4270: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
4280: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
4290: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
42a0: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
42b0: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
42c0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
42d0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
42e0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
42f0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
4300: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
4310: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
4320: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
4330: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
4340: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
4350: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
4360: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
4370: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
4380: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
4390: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
43a0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
43b0: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
43c0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
43d0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
43e0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
43f0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
4400: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
4410: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
4420: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
4430: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4440: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
4450: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
4460: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
4470: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
4480: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
4490: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
44a0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
44b0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
44c0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
44d0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 23  NO 2147483647..#
44e0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
44f0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
4500: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
4510: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
4520: 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74 61  Pager) );.*/.sta
4530: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
4540: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
4550: 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f 2a   *pPager){..  /*
4560: 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73 20   A temp-file is 
4570: 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52 5f  always in PAGER_
4580: 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41 47  EXCLUSIVE or PAG
4590: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2e  ER_SYNCED state.
45a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
45b0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
45c0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  0 || pPager->sta
45d0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
45e0: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  IVE );..  /* The
45f0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
4600: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
4610: 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  set for temp-fil
4620: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
4630: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
4640: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63  ==0 || pPager->c
4650: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29  hangeCountDone )
4660: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  ;..  return 1;.}
4670: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
4680: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
4690: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
46a0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
46b0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
46c0: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
46d0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
46e0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
46f0: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
4700: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
4710: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
4720: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
4730: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
4740: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
4750: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
4760: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
4770: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
4780: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
4790: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
47a0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
47b0: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
47c0: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
47d0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
47e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
47f0: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
4800: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
4810: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
4820: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
4830: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
4840: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
4850: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
4860: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
4870: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
4880: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
4890: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
48a0: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
48b0: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
48c0: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
48d0: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
48e0: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
48f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4900: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4910: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
4920: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
4930: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
4940: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
4950: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
4960: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
4970: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
4980: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4990: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
49a0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
49b0: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
49c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
49d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
49e0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
49f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4a00: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
4a10: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
4a20: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
4a30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
4a40: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
4a50: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
4a60: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4a70: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4a80: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
4a90: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
4aa0: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
4ab0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
4ac0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
4ad0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
4ae0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
4af0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
4b00: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4b10: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
4b20: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
4b30: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
4b40: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
4b50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4b60: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
4b70: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
4b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4b90: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4ba0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4bb0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
4bc0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
4bd0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
4be0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
4bf0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
4c00: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
4c10: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4c20: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4c30: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4c40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4c50: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4c60: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4c70: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4c80: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4c90: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
4ca0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
4cb0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
4cc0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
4cd0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
4ce0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
4cf0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
4d00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
4d10: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
4d20: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
4d30: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
4d40: 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
4d50: 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  s a file descrip
4d60: 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65  tor (type sqlite
4d70: 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74  3_file*)..** Ret
4d80: 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e  urn 0 if it is n
4d90: 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d  ot open, or non-
4da0: 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29  zero (but not 1)
4db0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
4dc0: 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
4dd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
4de0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a   be written as:.
4df0: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70  **.**   if( isOp
4e00: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
4e10: 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73  ){ ....**.** ins
4e20: 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20  tead of.**.**   
4e30: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d  if( pPager->jfd-
4e40: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e  >pMethods ){ ...
4e50: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70  .*/.#define isOp
4e60: 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e  en(pFd) ((pFd)->
4e70: 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a  pMethods)../*.**
4e80: 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20   If file pFd is 
4e90: 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  open, call sqlit
4ea0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20  e3OsUnlock() on 
4eb0: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
4ec0: 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  t osUnlock(sqlit
4ed0: 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e  e3_file *pFd, in
4ee0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20  t eLock){.  if( 
4ef0: 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b 0a  !isOpen(pFd) ){.
4f00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4f10: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
4f20: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
4f30: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
4f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
4f50: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
4f60: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
4f70: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
4f80: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
4f90: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
4fa0: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
4fb0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
4fc0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
4fd0: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
4fe0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
4ff0: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
5000: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
5010: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
5020: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
5030: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
5040: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
5050: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
5060: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
5070: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
5080: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
5090: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
50a0: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
50b0: 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  .** The optimiza
50c0: 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77  tion is also alw
50d0: 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ays enabled for 
50e0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
50f0: 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72   It is.** an err
5100: 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  or to call this 
5110: 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67  function if pPag
5120: 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  er is opened on 
5130: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
5140: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
5150: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
5160: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
5170: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
5180: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
5190: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
51a0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
51b0: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
51c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
51d0: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
51e0: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
51f0: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
5200: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
5210: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5220: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
5230: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
5240: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
5250: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
5260: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
5270: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
5280: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ile ){.    int d
5290: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52b0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
52c0: 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e  istics */.    in
52d0: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
5300: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  /.    int szPage
5310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5320: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
5330: 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  size */..    ass
5340: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
5350: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64  er->fd) );.    d
5360: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
5370: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
5380: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
5390: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50      nSector = pP
53a0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
53b0: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
53c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
53d0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
53e0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
53f0: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
5400: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
5410: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
5420: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
5430: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
5440: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
5450: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
5460: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
5470: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
5480: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
5490: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
54a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
54b0: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
54c0: 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e  Z(pPager);.}.#en
54d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  dif../*.** If SQ
54e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
54f0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
5500: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
5510: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
5520: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
5530: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
5540: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
5550: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
5560: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
5570: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
5580: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
5590: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
55a0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
55b0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
55c0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
55d0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
55e0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
55f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
5600: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
5610: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
5620: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
5630: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
5640: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
5650: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
5660: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
5670: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
5680: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
5690: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
56a0: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
56b0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
56c0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
56d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
56e0: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
56f0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
5700: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
5710: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
5720: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
5730: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
5740: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
5750: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
5760: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
5770: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
5780: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
5790: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
57a0: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
57b0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
57c0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
57d0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
57e0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
57f0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
5800: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
5810: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
5820: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
5830: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5840: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
5850: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
5860: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
5870: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
5880: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
5890: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
58a0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
58b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
58c0: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
58d0: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
58e0: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
58f0: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
5900: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
5910: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
5920: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
5930: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
5940: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
5950: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
5960: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
5970: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
5980: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
5990: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
59a0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
59b0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
59c0: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
59d0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
59e0: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
59f0: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
5a00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5a10: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
5a20: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
5a30: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
5a40: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
5a50: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
5a60: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
5a70: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
5a80: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
5a90: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
5aa0: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
5ab0: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
5ac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5ad0: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
5ae0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
5af0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
5b00: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
5b10: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
5b20: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
5b30: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
5b40: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
5b50: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
5b60: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
5b70: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
5b80: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
5b90: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
5ba0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
5bb0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
5bc0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5bd0: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
5be0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
5bf0: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
5c00: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
5c10: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
5c20: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
5c30: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
5c40: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
5c50: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
5c60: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
5c70: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
5c80: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
5c90: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
5ca0: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
5cb0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
5cc0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
5cd0: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
5ce0: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
5cf0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
5d00: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
5d10: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
5d20: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
5d30: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
5d40: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
5d50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5d60: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
5d70: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
5d80: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
5d90: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
5da0: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
5db0: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
5dc0: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
5dd0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
5de0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
5df0: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
5e00: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
5e10: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
5e20: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
5e30: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
5e40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5e50: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
5e60: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
5e70: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
5e80: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
5e90: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5eb0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
5ec0: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ee0: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
5ef0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
5f00: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
5f10: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
5f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
5f30: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
5f40: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
5f50: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
5f60: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
5f70: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
5f80: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
5f90: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
5fa0: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
5fc0: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
5fd0: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
5fe0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
5ff0: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
6000: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
6010: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
6020: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
6030: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
6040: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
6050: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
6060: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
6070: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
6080: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
6090: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
60a0: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
60b0: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
60c0: 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  r .   || SQLITE_
60d0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
60e0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
60f0: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
6100: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
6110: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
6120: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
6130: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
6140: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
6150: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
6160: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
6170: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
6180: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
6190: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
61a0: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
61b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
61c0: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
61d0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
61e0: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
61f0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
6200: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
6210: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
6220: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
6230: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
6240: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
6250: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
6260: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
6270: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
6280: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
6290: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
62a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
62b0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
62c0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
62d0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
62e0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
62f0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
6300: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
6310: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
6320: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
6330: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
6340: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
6350: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
6360: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
6370: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
6380: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6390: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
63a0: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
63b0: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
63c0: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
63d0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
63e0: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
63f0: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
6400: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
6410: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
6420: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
6430: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
6440: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
6450: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
6460: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
6470: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
6480: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
6520: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
6530: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
6540: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
6550: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
6560: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6570: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
6580: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
6590: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
65a0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
65b0: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
65c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
65d0: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
65e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
65f0: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
6600: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
6610: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
6620: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6630: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
6640: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
6650: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
6660: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
6670: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
6680: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
6690: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
66a0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
66b0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
66c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
66d0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
66e0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
66f0: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
6700: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
6710: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
6720: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
6730: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
6740: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
6750: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
6760: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
6770: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
6780: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
6790: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
67a0: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
67b0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
67c0: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
67d0: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
67e0: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
67f0: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
6800: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6810: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6820: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
6830: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
6840: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
6850: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
6860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
6880: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
6890: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
68a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
68b0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
68c0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
68d0: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
68e0: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
68f0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
6900: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
6910: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
6920: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
6930: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
6940: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
6950: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
6960: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
6970: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
6980: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
6990: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
69a0: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
69b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
69c0: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
69d0: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
69e0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
69f0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
6a00: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
6a10: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
6a20: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
6a30: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
6a40: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
6a50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6a70: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
6a80: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
6a90: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
6aa0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6ab0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
6ae0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
6af0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
6b00: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
6b10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
6b20: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
6b30: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
6b40: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
6b50: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
6b60: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
6b70: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
6b80: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
6b90: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
6ba0: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
6bb0: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
6bc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
6bd0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
6be0: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
6bf0: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
6c00: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
6c10: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
6c20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6c30: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6c40: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
6c50: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
6c60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c80: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
6c90: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
6ca0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
6cb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
6cc0: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
6cd0: 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
6ce0: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
6cf0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
6d00: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6d10: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75   is committed bu
6d20: 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  t the write lock
6d30: 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c   .    ** is stil
6d40: 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  l held on the fi
6d50: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
6d60: 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e  a size limit con
6d70: 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20  figured for .   
6d80: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
6d90: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  nt journal and t
6da0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6db0: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d  currently consum
6dc0: 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73  es more.    ** s
6dd0: 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c  pace than that l
6de0: 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c  imit allows for,
6df0: 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77   truncate it now
6e00: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
6e10: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e  ed.    ** to syn
6e20: 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f  c the file follo
6e30: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
6e40: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
6e50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6e60: 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b  K && iLimit>0 ){
6e70: 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20  .      i64 sz;. 
6e80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6e90: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
6ea0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20  er->jfd, &sz);. 
6eb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6ec0: 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69  ITE_OK && sz>iLi
6ed0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mit ){.        r
6ee0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
6ef0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
6f00: 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  d, iLimit);.    
6f10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6f20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6f30: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
6f40: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
6f50: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
6f60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
6f70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
6f80: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
6f90: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
6fa0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
6fb0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
6fc0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
6fd0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
6fe0: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
6ff0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
7000: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
7010: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
7020: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
7030: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
7040: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
7050: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
7060: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
7070: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
7080: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
7090: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
70a0: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
70b0: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
70c0: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
70d0: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
70e0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
70f0: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
7100: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
7110: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
7120: 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rnal..** - 4 byt
7130: 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67  es: Database pag
7140: 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46  e size..** .** F
7150: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
7160: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
7170: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
7180: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
7190: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
71a0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
71b0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
71c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
71e0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
71f0: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
7200: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
7210: 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79  e;  /* Temporary
7220: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62   space used to b
7230: 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  uild header */. 
7240: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70   u32 nHeader = p
7250: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
7260: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7270: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
7280: 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a  o by zHeader */.
7290: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20    u32 nWrite;   
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
72c0: 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20  f header sector 
72d0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
72e0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7310: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
7320: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
7330: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
7340: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
7350: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69  be open. */..  i
7360: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
7370: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7380: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
7390: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
73a0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
73b0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
73c0: 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
73d0: 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74  nts and any of t
73e0: 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64  hem were created
73f0: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
7400: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75   most recent jou
7410: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20  rnal header was 
7420: 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
7430: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53  the .  ** PagerS
7440: 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
7450: 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a  set fields now..
7460: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
7470: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
7480: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
7490: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
74a0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
74b0: 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  drOffset==0 ){. 
74c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
74d0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
74e0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
74f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
7500: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
7510: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
7520: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7530: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
7540: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
7550: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
7560: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7570: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7580: 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  gic));..  /* .  
7590: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
75a0: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
75b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
75c0: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
75d0: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
75e0: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
75f0: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
7600: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
7610: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
7620: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
7630: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
7640: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7650: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
7660: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
7670: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
7680: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
7690: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
76a0: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
76b0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
76c0: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
76d0: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
76e0: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
76f0: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
7700: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
7710: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
7720: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
7730: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
7740: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
7750: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
7760: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
7770: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
7780: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
7790: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
77a0: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
77b0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
77c0: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
77d0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
77e0: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
77f0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
7800: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
7810: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
7820: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
7830: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
7840: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
7850: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
7860: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
7870: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
7880: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
7890: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
78a0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
78b0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
78c0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
78d0: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
78e0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
78f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
7900: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
7910: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
7920: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
7930: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
7940: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
7950: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
7960: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
7970: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
7980: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
7990: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
79a0: 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
79b0: 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70  r->noSync) || (p
79c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
79d0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
79e0: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20  LMODE_MEMORY).  
79f0: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
7a00: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
7a10: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
7a20: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
7a30: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
7a40: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
7a50: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7a60: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7a70: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
7a80: 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69  lse{.    put32bi
7a90: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7aa0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7ab0: 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )], 0);.  }..  /
7ac0: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
7ad0: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
7ae0: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
7af0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
7b00: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
7b10: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
7b20: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
7b30: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7b40: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7b50: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
7b60: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7b70: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
7b80: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
7b90: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7ba0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7bb0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
7bc0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
7bd0: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
7be0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7bf0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
7c00: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
7c10: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7c20: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7c30: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
7c40: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
7c50: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
7c60: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
7c70: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7c80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
7c90: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
7ca0: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
7cb0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
7cc0: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
7cd0: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
7ce0: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
7cf0: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
7d00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
7d10: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
7d20: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
7d30: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
7d40: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
7d50: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
7d60: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
7d70: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
7d80: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
7d90: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
7da0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
7db0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7dc0: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
7dd0: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
7de0: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
7df0: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
7e00: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
7e10: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
7e20: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
7e30: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
7e40: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
7e50: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
7e60: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
7e70: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
7e80: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
7e90: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
7ea0: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
7eb0: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
7ec0: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
7ed0: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
7ee0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
7ef0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
7f00: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
7f10: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
7f20: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
7f30: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
7f40: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
7f50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
7f60: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
7f70: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
7f80: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
7f90: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
7fa0: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
7fb0: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
7fc0: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
7fd0: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
7fe0: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
7ff0: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
8000: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
8010: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
8020: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
8030: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8040: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
8050: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
8060: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
8070: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
8080: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
8090: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
80a0: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
80b0: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
80c0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
80d0: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
80e0: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
80f0: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
8100: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
8110: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
8120: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
8130: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
8140: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
8150: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
8160: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
8170: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
8180: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
8190: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
81a0: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
81b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
81c0: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
81d0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
81e0: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
81f0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
8200: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
8210: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
8220: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
8230: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
8240: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8250: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
8260: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
8270: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8280: 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  f);.    pPager->
8290: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
82a0: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
82b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
82c0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
82d0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
82e0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
82f0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
8300: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
8310: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
8320: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
8330: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
8340: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
8350: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
8360: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
8370: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
8380: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
8390: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
83a0: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
83b0: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
83c0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
83d0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
83e0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
83f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
8400: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
8410: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
8420: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
8430: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
8440: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
8450: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
8460: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
8470: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
8480: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
8490: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
84a0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
84b0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
84c0: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
84d0: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
84e0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
84f0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
8500: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
8510: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8520: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
8530: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
8540: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
8550: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
8560: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
8570: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
8580: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
8590: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
85a0: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
85b0: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
85c0: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
85d0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
85e0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
85f0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
8600: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
8610: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
8620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8630: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
8640: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8660: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
8670: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
8680: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8690: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
86a0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
86b0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
86c0: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
86e0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
86f0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8700: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8710: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8720: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8730: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
8740: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
8750: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8760: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8770: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8780: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8790: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
87a0: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
87b0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
87c0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
87d0: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8800: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8810: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8820: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8830: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
8840: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
8850: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8860: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8870: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8880: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8890: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
88a0: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
88b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
88c0: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
88d0: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
88e0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
88f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8900: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8910: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8920: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8930: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8940: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8950: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8960: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8970: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8980: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8990: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
89a0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
89b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
89c0: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
89d0: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
89e0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
89f0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8a00: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8a10: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8a20: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8a30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8a40: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8a50: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8a60: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8a70: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8a80: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8a90: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8aa0: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8ab0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
8ac0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8ad0: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8ae0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8af0: 69 48 64 72 4f 66 66 29 3b 0a 20 20 69 66 28 20  iHdrOff);.  if( 
8b00: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
8b10: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d   rc;.  }.  if( m
8b20: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8b30: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8b40: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8b60: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
8b70: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8b80: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8b90: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8ba0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8bb0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8bc0: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8bd0: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8be0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8bf0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8c00: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8c10: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8c20: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8c30: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8c40: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8c50: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8c60: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8c70: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8c80: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8c90: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8ca0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8cb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8cc0: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8cd0: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8ce0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8cf0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8d00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8d10: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8d20: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8d30: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8d40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8d50: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8d60: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8d80: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8d90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8da0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8db0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8dc0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8dd0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8de0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8df0: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8e00: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8e10: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8e20: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8e30: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8e40: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8e50: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8e60: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8e70: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8e80: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8e90: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8ea0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8eb0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
8ec0: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
8ed0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8ee0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8ef0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8f00: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
8f10: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
8f20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8f30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
8f40: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
8f50: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
8f60: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
8f70: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
8f80: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
8f90: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
8fa0: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
8fb0: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
8fc0: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
8fd0: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
8fe0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8ff0: 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72   512, and not gr
9000: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
9010: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
9020: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
9030: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
9040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9050: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9070: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31  | iSectorSize<51
9080: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
9090: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
90a0: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
90b0: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
90c0: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
90d0: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
90e0: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
90f0: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
9100: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
9110: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
9120: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
9130: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
9140: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
9150: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
9160: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
9170: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
9180: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9190: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
91a0: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
91b0: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
91c0: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
91d0: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
91e0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
91f0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
9200: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
9210: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
9220: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
9230: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9240: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9250: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
9260: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
9270: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9280: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
9290: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
92a0: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
92b0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
92c0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
92d0: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
92e0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
92f0: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
9300: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
9310: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
9320: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
9330: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
9340: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
9350: 50 61 67 65 53 69 7a 65 31 36 29 3b 0a 20 20 20  PageSize16);.   
9360: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
9370: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9380: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9390: 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69  TE_OK || iPageSi
93a0: 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65  ze16==(u16)iPage
93b0: 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
93c0: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
93d0: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
93e0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
93f0: 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
9400: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
9410: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
9420: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
9430: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
9440: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
9450: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
9460: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
9470: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
9480: 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
9490: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
94a0: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
94b0: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
94c0: 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
94d0: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
94e0: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
94f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
9500: 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
9510: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
9520: 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
9530: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
9540: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9550: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
9560: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
9570: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
9580: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
9590: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
95a0: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
95b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
95c0: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
95d0: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
95e0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
95f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9600: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
9610: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
9620: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
9630: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
9640: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
9650: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
9660: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
9670: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
9680: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
9690: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
96a0: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
96b0: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
96c0: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
96d0: 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
96e0: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
96f0: 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
9700: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
9710: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
9720: 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
9730: 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
9740: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9750: 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
9760: 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
9770: 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
9780: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
9790: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
97a0: 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
97b0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
97c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
97d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
97e0: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
97f0: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
9800: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
9810: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
9820: 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
9830: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
9840: 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
9850: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
9860: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
9870: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
9880: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
9890: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
98a0: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
98b0: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
98c0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
98d0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
98e0: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
98f0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
9900: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
9910: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
9920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9930: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9940: 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
9970: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9980: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
99b0: 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
99c0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
99d0: 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
99f0: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
9a00: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
9a10: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
9a40: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
9a50: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   */..  if( !zMas
9a60: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
9a70: 65 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70  etMaster.   || p
9a80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
9a90: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9aa0: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9ab0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
9ac0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ad0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9ae0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
9af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9b00: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9b10: 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
9b20: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9b30: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9b40: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
9b50: 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
9b60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
9b70: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
9b80: 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
9b90: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
9ba0: 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
9bb0: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
9bc0: 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
9bd0: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
9be0: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
9bf0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
9c00: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
9c10: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
9c20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9c30: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
9c40: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
9c50: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
9c60: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
9c70: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
9c80: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
9c90: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
9ca0: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
9cb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9cc0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
9cd0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
9ce0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9cf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9d00: 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
9d10: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9d20: 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
9d30: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
9d40: 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
9d50: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
9d60: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
9d70: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
9d80: 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
9d90: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
9da0: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
9db0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
9dc0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
9dd0: 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
9de0: 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
9df0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9e00: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
9e10: 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
9e20: 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
9e30: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
9e40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9e50: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
9e60: 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
9e70: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9e80: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9e90: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9ea0: 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
9eb0: 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
9ec0: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
9ed0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9ee0: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
9ef0: 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
9f00: 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
9f10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
9f20: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
9f30: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
9f40: 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50  Master+20);.  pP
9f50: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
9f60: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
9f70: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
9f80: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
9f90: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
9fa0: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
9fb0: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
9fc0: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
9fd0: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
9fe0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
9ff0: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
a000: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
a010: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
a020: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
a030: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
a040: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
a050: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
a060: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
a070: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
a080: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
a090: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
a0a0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
a0b0: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
a0c0: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
a0d0: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
a0e0: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
a0f0: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
a100: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
a110: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
a120: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
a130: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
a140: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
a150: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
a160: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
a170: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a180: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
a190: 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
a1a0: 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
a1b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
a1c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
a1d0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
a1e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
a1f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
a200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
a220: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
a230: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
a240: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
a250: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
a260: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
a270: 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
a280: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
a290: 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
a2a0: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
a2b0: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
a2c0: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
a2d0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
a2e0: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
a310: 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
a320: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
a330: 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
a340: 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
a350: 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
a360: 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
a370: 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
a380: 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
a390: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
a3a0: 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
a3b0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
a3c0: 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
a3d0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
a3e0: 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
a3f0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
a400: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
a410: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a420: 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  e, discard all i
a430: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20  n-memory pages. 
a440: 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  If.** the pager 
a450: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a460: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  e, then this cal
a470: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  l is a no-op..**
a480: 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61  .** TODO: Why ca
a490: 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74  n we not reset t
a4a0: 68 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69  he pager while i
a4b0: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a  n error state?.*
a4c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
a4d0: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
a4e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
a4f0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65  SQLITE_OK==pPage
a500: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
a510: 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
a520: 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
a530: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c  Backup);.    sql
a540: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
a550: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a560: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
a570: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
a580: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
a590: 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
a5a0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
a5b0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
a5c0: 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
a5d0: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
a5e0: 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
a5f0: 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
a600: 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
a610: 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
a620: 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
a630: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
a640: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
a650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
a660: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
a670: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
a680: 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
a690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
a6a0: 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
a6b0: 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
a6c0: 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
a6d0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
a6e0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
a6f0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
a700: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
a710: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
a720: 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
a730: 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
a740: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
a750: 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
a760: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
a770: 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
a780: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
a790: 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
a7a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
a7b0: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
a7c0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
a7d0: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
a7e0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
a7f0: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
a800: 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
a810: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
a820: 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
a830: 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
a840: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
a850: 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
a860: 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
a870: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
a880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
a890: 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
a8a0: 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
a8b0: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
a8c0: 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
a8d0: 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
a8e0: 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
a8f0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
a900: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
a910: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
a920: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a930: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
a940: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
a950: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
a960: 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
a970: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
a980: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
a990: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
a9a0: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
a9b0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
a9c0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
a9d0: 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
a9e0: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
a9f0: 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
aa00: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
aa10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
aa20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
aa30: 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
aa40: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
aa50: 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
aa60: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
aa70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
aa80: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
aa90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
aaa0: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
aab0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
aac0: 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69  he pager.** is i
aad0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
aae0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
aaf0: 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
ab00: 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  y in error state
ab10: 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f  , discard the co
ab20: 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68  ntents of .** th
ab30: 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65  e cache and rese
ab40: 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  t the Pager stru
ab50: 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73  cture internal s
ab60: 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69  tate. If there i
ab70: 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75  s.** an open jou
ab80: 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20  rnal-file, then 
ab90: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20  the next time a 
aba0: 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f  shared-lock is o
abb0: 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68  btained.** on th
abc0: 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79  e pager file (by
abd0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
abe0: 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20  er process), it 
abf0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74  will be.** treat
ac00: 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ed as a hot-jour
ac10: 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
ac20: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
ac30: 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
ac40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
ac50: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
ac60: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
ac70: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
aca0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61   */..    /* Alwa
acb0: 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ys close the jou
acc0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
acd0: 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
ace0: 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a  base lock..    *
acf0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f  * Otherwise, ano
ad00: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
ad10: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
ad20: 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20  e=delete might. 
ad30: 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
ad40: 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75   file out from u
ad50: 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
ad60: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ad70: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
ad80: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
ad90: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
ada0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
adb0: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
adc0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72  urnal = 0;.    r
add0: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
ade0: 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
adf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
ae00: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f   is unlocked, so
ae10: 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68  mebody else migh
ae20: 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65  t change it. The
ae30: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73  .    ** values s
ae40: 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64  tored in Pager.d
ae50: 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74  bSize etc. might
ae60: 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20   become invalid 
ae70: 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68  if.    ** this h
ae80: 61 70 70 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65  appens. TODO: Re
ae90: 61 6c 6c 79 2c 20 74 68 69 73 20 64 6f 65 73 6e  ally, this doesn
aea0: 27 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  't need to be cl
aeb0: 65 61 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74  eared.    ** unt
aec0: 69 6c 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  il the change-co
aed0: 75 6e 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c  unter check fail
aee0: 73 20 69 6e 20 70 61 67 65 72 53 68 61 72 65 64  s in pagerShared
aef0: 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  Lock()..    */. 
af00: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
af10: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20  eValid = 0;..   
af20: 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70   rc = osUnlock(p
af30: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
af40: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  CK);.    if( rc 
af50: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
af60: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
af70: 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
af80: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
af90: 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f   pPager))..    /
afa0: 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
afb0: 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
afc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
afd0: 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
afe0: 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73  t be.    ** trus
aff0: 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
b000: 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
b010: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f  unlocked, the co
b020: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
b030: 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62    ** cache can b
b040: 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20  e discarded and 
b050: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73  the error code s
b060: 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20  afely cleared.. 
b070: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
b080: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
b090: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b0a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b0b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
b0c0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
b0d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
b0e0: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
b0f0: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  r);.    }..    p
b100: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
b110: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
b120: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
b130: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
b140: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
b150: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b160: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
b170: 6e 20 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54  n IOERR, CORRUPT
b180: 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a   or FULL error.*
b190: 2a 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  * may have occur
b1a0: 72 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 61  red. The first a
b1b0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
b1c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
b1d0: 72 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  r .** structure,
b1e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20   the second the 
b1f0: 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
b200: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
b210: 62 79 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41  by a pager .** A
b220: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
b230: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
b240: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
b250: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b260: 20 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e   .** to this fun
b270: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
b280: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b290: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
b2a0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
b2b0: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
b2c0: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
b2d0: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
b2e0: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
b2f0: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
b300: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
b310: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
b320: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
b330: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
b340: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
b350: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
b360: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
b370: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
b380: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
b390: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
b3a0: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
b3b0: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
b3c0: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
b3d0: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
b3e0: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
b3f0: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
b400: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
b410: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
b420: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
b430: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
b440: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
b450: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
b460: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
b470: 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
b480: 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
b490: 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
b4a0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b4b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
b4c0: 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
b4d0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
b4e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b4f0: 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
b500: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
b510: 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
b520: 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
b530: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
b540: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
b550: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
b560: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b570: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
b580: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
b590: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
b5a0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
b5b0: 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32  );.  if(.    rc2
b5c0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
b5d0: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
b5e0: 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63  _IOERR ||.    rc
b5f0: 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  2==SQLITE_CORRUP
b600: 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65  T.  ){.    pPage
b610: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
b620: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
b630: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
b640: 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20 73 71  LOCK .     && sq
b650: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
b660: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
b670: 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a  che)==0 .    ){.
b680: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
b690: 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79  pager is already
b6a0: 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20   unlocked, call 
b6b0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e  pager_unlock() n
b6c0: 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  ow to.      ** c
b6d0: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
b6e0: 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72 65 20  tate and ensure 
b6f0: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 2d 63  that the pager-c
b700: 61 63 68 65 20 69 73 20 0a 20 20 20 20 20 20 2a  ache is .      *
b710: 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  * completely emp
b720: 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
b730: 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
b740: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
b750: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b760: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
b770: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
b780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
b790: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
b7a0: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
b7b0: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
b7c0: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
b7d0: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
b7e0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b7f0: 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
b800: 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
b810: 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
b820: 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
b830: 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
b840: 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
b850: 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
b860: 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
b870: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
b880: 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
b890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
b8a0: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  nd clear the err
b8b0: 6f 72 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  or state. If thi
b8c0: 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20  s means that.** 
b8d0: 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
b8e0: 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
b8f0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
b900: 74 68 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74  the next connect
b910: 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  ion.** to obtain
b920: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
b930: 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
b940: 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
b950: 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c  ne) will.** roll
b960: 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
b970: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
b980: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
b990: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
b9a0: 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
b9b0: 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
b9c0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
b9d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
b9e0: 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
b9f0: 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
ba00: 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
ba10: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
ba20: 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
ba30: 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
ba40: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
ba50: 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
ba60: 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
ba70: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
ba80: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
ba90: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
baa0: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
bab0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
bac0: 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 73  _OK && pPager->s
bad0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
bae0: 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  RVED ){.    sqli
baf0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
bb00: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
bb10: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
bb20: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
bb30: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
bb40: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
bb50: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
bb60: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  r);.}../*.** Thi
bb70: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
bb80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
bb90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
bba0: 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
bbb0: 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
bbc0: 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
bbd0: 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
bbe0: 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
bbf0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
bc00: 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
bc10: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
bc20: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
bc30: 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
bc40: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
bc50: 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
bc60: 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
bc70: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
bc80: 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
bc90: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
bca0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
bcb0: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  is in PAGER_SHAR
bcc0: 45 44 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f  ED or PAGER_UNLO
bcd0: 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  CK state when th
bce0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
bcf0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
bd00: 20 6e 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73 20   no-op (returns 
bd10: 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a  SQLITE_OK)..**.*
bd20: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
bd30: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
bd40: 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
bd50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
bd60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
bd70: 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
bd80: 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
bd90: 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
bda0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
bdb0: 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
bdc0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
bdd0: 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
bde0: 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
bdf0: 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
be00: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
be10: 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
be20: 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
be30: 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
be40: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
be50: 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
be60: 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
be70: 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
be80: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
be90: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
bea0: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
beb0: 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
bec0: 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
bed0: 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
bee0: 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
bef0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
bf00: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
bf10: 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
bf20: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
bf30: 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
bf40: 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
bf50: 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
bf60: 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
bf70: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
bf80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
bf90: 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
bfa0: 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
bfb0: 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
bfc0: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
bfd0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
bfe0: 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
bff0: 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
c000: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
c010: 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
c020: 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
c030: 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
c040: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
c050: 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
c060: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
c070: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
c080: 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
c090: 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
c0a0: 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
c0b0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
c0c0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
c0d0: 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
c0e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
c0f0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
c100: 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
c110: 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
c120: 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
c130: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
c140: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
c150: 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
c160: 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
c170: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
c180: 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
c190: 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
c1a0: 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
c1b0: 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
c1c0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
c1d0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c1e0: 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
c1f0: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
c200: 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
c210: 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
c220: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
c230: 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
c240: 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
c250: 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  , if running in 
c260: 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f  non-exclusive mo
c270: 64 65 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65 72  de, the.** pager
c280: 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
c290: 53 48 41 52 45 44 20 73 74 61 74 65 20 28 61 6e  SHARED state (an
c2a0: 64 20 64 6f 77 6e 67 72 61 64 65 73 20 74 68 65  d downgrades the
c2b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20   lock on the.** 
c2c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 63  database file ac
c2d0: 63 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a  cordingly)..**.*
c2e0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
c2f0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
c300: 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
c310: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 59 4e 43  is in PAGER_SYNC
c320: 45 44 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20  ED state,.** it 
c330: 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 45  moves to PAGER_E
c340: 58 43 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63  XCLUSIVE. No loc
c350: 6b 73 20 61 72 65 20 64 6f 77 6e 67 72 61 64 65  ks are downgrade
c360: 64 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  d when running i
c370: 6e 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6d  n.** exclusive m
c380: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ode..**.** SQLIT
c390: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
c3a0: 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
c3b0: 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
c3c0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
c3d0: 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
c3e0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
c3f0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
c400: 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
c410: 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
c420: 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
c430: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
c440: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
c450: 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
c460: 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
c470: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c480: 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
c490: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
c4a0: 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
c4b0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
c4c0: 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
c4d0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
c4e0: 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
c4f0: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
c500: 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
c510: 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
c520: 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
c530: 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
c540: 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
c550: 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
c560: 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
c570: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c580: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
c590: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
c5a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c5b0: 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20  t hasMaster){.  
c5c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c5d0: 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f  OK;      /* Erro
c5e0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72  r code from jour
c5f0: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
c600: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
c610: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
c620: 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f  _OK;     /* Erro
c630: 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66  r code from db f
c640: 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  ile unlock opera
c650: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70  tion */..  if( p
c660: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
c670: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
c680: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c690: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  _OK;.  }.  relea
c6a0: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
c6b0: 70 50 61 67 65 72 29 3b 0a 0a 20 20 61 73 73 65  pPager);..  asse
c6c0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
c6d0: 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
c6e0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
c6f0: 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
c700: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
c710: 0a 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 54  ..    /* TODO: T
c720: 68 65 72 65 27 73 20 61 20 70 72 6f 62 6c 65 6d  here's a problem
c730: 20 68 65 72 65 20 69 66 20 61 20 6a 6f 75 72 6e   here if a journ
c740: 61 6c 2d 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  al-file was open
c750: 65 64 20 69 6e 20 4d 45 4d 4f 52 59 0a 20 20 20  ed in MEMORY.   
c760: 20 2a 2a 20 6d 6f 64 65 20 61 6e 64 20 74 68 65   ** mode and the
c770: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
c780: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
c790: 20 54 52 55 4e 43 41 54 45 20 6f 72 20 50 45 52   TRUNCATE or PER
c7a0: 53 49 53 54 0a 20 20 20 20 2a 2a 20 64 75 72 69  SIST.    ** duri
c7b0: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
c7c0: 6f 6e 2e 20 54 68 69 73 20 63 6f 64 65 20 73 68  on. This code sh
c7d0: 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 20  ould be changed 
c7e0: 74 6f 20 61 73 73 75 6d 65 0a 20 20 20 20 2a 2a  to assume.    **
c7f0: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
c800: 6c 20 6d 6f 64 65 20 68 61 73 20 6e 6f 74 20 63  l mode has not c
c810: 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
c820: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
c830: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 65 64 2e  .    ** started.
c840: 20 41 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33   And the sqlite3
c850: 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
c860: 28 29 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  () function shou
c870: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 68 61  ld be.    ** cha
c880: 6e 67 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  nged to make sur
c890: 65 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74  e that this is t
c8a0: 68 65 20 63 61 73 65 20 74 6f 6f 2e 0a 20 20 20  he case too..   
c8b0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61   */..    /* Fina
c8c0: 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
c8d0: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
c8e0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c8f0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
c900: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
c910: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d  ){.      int isM
c920: 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73  emoryJournal = s
c930: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
c940: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  al(pPager->jfd);
c950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
c960: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
c970: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69  d);.      if( !i
c980: 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29  sMemoryJournal )
c990: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c9a0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
c9b0: 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
c9c0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
c9d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c9e0: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
c9f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
ca00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ca10: 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
ca20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
ca30: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
ca40: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
ca50: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
ca60: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
ca70: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
ca80: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
ca90: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
caa0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
cab0: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
cac0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
cad0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
cae0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
caf0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
cb00: 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
cb10: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
cb20: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
cb30: 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20  PERSIST.    ){. 
cb40: 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
cb50: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
cb60: 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
cb70: 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
cb80: 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
cb90: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
cba0: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
cbb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
cbc0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
cbd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
cbe0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
cbf0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cc00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
cc10: 54 45 20 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20  TE || rc );.    
cc20: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
cc30: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
cc40: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
cc50: 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65  ITE_OK && !pPage
cc60: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
cc70: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
cc80: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
cc90: 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
cca0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
ccb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
ccc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
ccd0: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c  CK_PAGES.    sql
cce0: 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
ccf0: 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
cd00: 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
cd10: 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e  t_pagehash);.#en
cd20: 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  dif..    sqlite3
cd30: 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
cd40: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
cd50: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
cd60: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
cd70: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
cd80: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
cd90: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70  urnal = 0;.    p
cda0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
cdb0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
cdc0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
cdd0: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
cde0: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
cdf0: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
ce00: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
ce10: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
ce20: 52 45 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  RED;.    pPager-
ce30: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
ce40: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
ce50: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
ce60: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
ce70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
ce80: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
ce90: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
cea0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
ceb0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
cec0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
ced0: 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
cee0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a  = 0;..  /* TODO:
cef0: 20 49 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c   Is this optimal
cf00: 3f 20 57 68 79 20 69 73 20 74 68 65 20 64 62 20  ? Why is the db 
cf10: 73 69 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64  size invalidated
cf20: 20 68 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e   here .  ** when
cf30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cf40: 6c 65 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b  le is not unlock
cf50: 65 64 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ed? */.  pPager-
cf60: 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b  >dbOrigSize = 0;
cf70: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
cf80: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
cf90: 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
cfa0: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28  ->dbSize);.  if(
cfb0: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70   !MEMDB ){.    p
cfc0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
cfd0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  id = 0;.  }..  r
cfe0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
cff0: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
d000: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
d010: 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e   aData must poin
d020: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
d030: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d040: 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
d050: 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  ta. Compute and 
d060: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
d070: 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20  m based ont the 
d080: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
d090: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61  .** page of data
d0a0: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
d0b0: 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72   value of pPager
d0c0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a  ->cksumInit..**.
d0d0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
d0e0: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
d0f0: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
d100: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
d110: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
d120: 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65  ial value (pPage
d130: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e  r->cksumInit) an
d140: 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79  d every 200th by
d150: 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  te.** of the pag
d160: 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67  e data, starting
d170: 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65   with byte offse
d180: 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t (pPager->pageS
d190: 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63  ize%200)..** Eac
d1a0: 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
d1b0: 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69  reted as an 8-bi
d1c0: 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  t unsigned integ
d1d0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69  er..**.** Changi
d1e0: 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75  ng the formula u
d1f0: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
d200: 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73  his checksum res
d210: 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  ults in an.** in
d220: 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e  compatible journ
d230: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  al file format..
d240: 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c  **.** If journal
d250: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
d260: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
d270: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
d280: 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73  ost likely .** s
d290: 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20  cenario is that 
d2a0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
d2b0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
d2c0: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
d2d0: 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75  ed. .** It is mu
d2e0: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
d2f0: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
d300: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d310: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
d320: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
d330: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
d340: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
d350: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
d360: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
d370: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
d380: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
d390: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
d3a0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
d3b0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
d3c0: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
d3d0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
d3e0: 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
d3f0: 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
d400: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
d410: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c   /* Checksum val
d420: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
d430: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
d440: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20  ->pageSize-200; 
d450: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
d460: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68   counter */.  wh
d470: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
d480: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
d490: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
d4a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
d4b0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
d4c0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
d4d0: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
d4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
d4f0: 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
d500: 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
d510: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
d520: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
d530: 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
d540: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
d550: 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
d560: 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
d570: 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
d580: 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
d590: 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
d5a0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
d5b0: 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
d5c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
d5d0: 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e  ** The isMainJrn
d5e0: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  l flag is true i
d5f0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
d600: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
d610: 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65  nal and.** false
d620: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
d630: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  nt journal.  The
d640: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
d650: 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63  ournal uses.** c
d660: 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
d670: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d680: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a   does not..**.**
d690: 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
d6a0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d6b0: 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d  record read from
d6c0: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
d6d0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  al file.** is gr
d6e0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
d6f0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
d700: 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
d710: 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a  en playback is.*
d720: 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51  * skipped and SQ
d730: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
d740: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ned..**.** If pD
d750: 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  one is not NULL,
d760: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
d770: 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68  cord of pages th
d780: 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  at have already.
d790: 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  ** been played b
d7a0: 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67  ack.  If the pag
d7b0: 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61  e at *pOffset ha
d7c0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
d7d0: 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69  layed back.** (i
d7e0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
d7f0: 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73  ing pDone bit is
d800: 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20   set) then skip 
d810: 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a  the playback..**
d820: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
d830: 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70  Done bit corresp
d840: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70  onding to the *p
d850: 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73  Offset page is s
d860: 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72  et.** prior to r
d870: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
d880: 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  If the page reco
d890: 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  rd is successful
d8a0: 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
d8b0: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d8c0: 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65  ile.** and playe
d8d0: 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c  d back, then SQL
d8e0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
d8f0: 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
d900: 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69  or occurs.** whi
d910: 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72  le reading the r
d920: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28  ecord from the (
d930: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
d940: 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69  e or while writi
d950: 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  ng.** to the dat
d960: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
d970: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
d980: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
d990: 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75  If data.** is su
d9a0: 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
d9b0: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
d9c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20  ournal file but 
d9d0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a  appears to be.**
d9e0: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
d9f0: 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
da00: 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e  ned. Data is con
da10: 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65  sidered corrupte
da20: 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63  d in.** two circ
da30: 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a  umstances:.** .*
da40: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
da50: 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ord page-number 
da60: 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72  is illegal (0 or
da70: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c   PAGER_MJ_PGNO),
da80: 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68   or.**   * If th
da90: 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e  e record is bein
daa0: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72  g rolled back fr
dab0: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
dac0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
dad0: 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
dae0: 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20   field does not 
daf0: 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64  match the record
db00: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
db10: 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
db20: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61   two scenarios a
db30: 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69  re possible duri
db40: 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  ng a savepoint r
db50: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
db60: 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65  f this is a save
db70: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  point rollback, 
db80: 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20  then memory may 
db90: 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d  have to be dynam
dba0: 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
dbb0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
dbc0: 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
dbd0: 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e   the case and an
dbe0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
dbf0: 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s,.** SQLITE_NOM
dc00: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
dc10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
dc20: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
dc30: 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
dc40: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
dc50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
dc60: 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64  ger being played
dc70: 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
dc80: 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
dc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
dca0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
dcb0: 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
dcc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e 73 79   */.  int isUnsy
dcd0: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
dce0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
dcf0: 65 61 64 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79  eading from unsy
dd00: 6e 63 65 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  nced main journa
dd10: 6c 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66  l */.  i64 *pOff
dd20: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
dd30: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
dd40: 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79  f record to play
dd50: 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
dd60: 53 61 76 65 70 6e 74 2c 20 20 20 20 20 20 20 20  Savepnt,        
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
dd80: 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
dd90: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69  rollback */.  Bi
dda0: 74 76 65 63 20 2a 70 44 6f 6e 65 20 20 20 20 20  tvec *pDone     
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ddc0: 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
ddd0: 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61  lready played ba
dde0: 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
ddf0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
de20: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
de30: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
de40: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
de50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
de60: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
de70: 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
de80: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
deb0: 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
dec0: 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ecking */.  u8 *
ded0: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
dee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
def0: 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66  porary storage f
df00: 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  or the page */. 
df10: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
df20: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fd;            /
df30: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
df40: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  iptor for the jo
df50: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
df60: 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e   assert( (isMain
df70: 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20  Jrnl&~1)==0 );  
df80: 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e      /* isMainJrn
df90: 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  l is 0 or 1 */. 
dfa0: 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65   assert( (isSave
dfb0: 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  pnt&~1)==0 );   
dfc0: 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74      /* isSavepnt
dfd0: 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
dfe0: 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72  assert( isMainJr
dff0: 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20  nl || pDone );  
e000: 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61     /* pDone alwa
e010: 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a  ys used on sub-j
e020: 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73  ournals */.  ass
e030: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c  ert( isSavepnt |
e040: 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20  | pDone==0 );   
e050: 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75  /* pDone never u
e060: 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70  sed on non-savep
e070: 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61  oint */..  aData
e080: 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e   = (u8*)pPager->
e090: 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73  pTmpSpace;.  ass
e0a0: 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20  ert( aData );   
e0b0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
e0c0: 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  orage must have 
e0d0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
e0e0: 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ocated */..  /* 
e0f0: 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
e100: 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61  mber and page da
e110: 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ta from the jour
e120: 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
e130: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65  al.  ** file. Re
e140: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
e150: 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
e160: 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
e170: 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a  occurs..  */.  j
e180: 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
e190: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
e1a0: 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20  pPager->sjfd;.  
e1b0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
e1c0: 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26  jfd, *pOffset, &
e1d0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
e1e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e1f0: 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
e200: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
e210: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
e220: 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
e230: 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
e240: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
e250: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
e260: 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
e270: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
e280: 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
e290: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
e2a0: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
e2b0: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
e2c0: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
e2d0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
e2e0: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
e2f0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
e300: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
e310: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
e320: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
e330: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
e340: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
e350: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
e360: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
e370: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
e380: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
e390: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
e3a0: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
e3b0: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
e3c0: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
e3d0: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
e3e0: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
e3f0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
e400: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
e410: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
e420: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
e430: 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
e440: 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
e450: 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
e460: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
e470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e480: 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
e490: 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
e4a0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
e4b0: 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
e4c0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
e4d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
e4e0: 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
e4f0: 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
e500: 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
e510: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
e520: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
e530: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
e540: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
e550: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
e560: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
e570: 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  o))!=SQLITE_OK )
e580: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e590: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
e5a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
e5b0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
e5c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
e5d0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
e5e0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e5f0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
e600: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
e610: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
e620: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
e630: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
e640: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
e650: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
e660: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
e670: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
e680: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e690: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
e6a0: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
e6b0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
e6c0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
e6d0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
e6e0: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
e6f0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
e700: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
e710: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
e720: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
e730: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
e740: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
e750: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
e760: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
e770: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
e780: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
e790: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
e7a0: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
e7b0: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
e7c0: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
e7d0: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
e7e0: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
e7f0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
e800: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
e810: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
e820: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
e830: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
e840: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
e850: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
e860: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
e870: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
e880: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
e890: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
e8a0: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
e8b0: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
e8c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
e8d0: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
e8e0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
e8f0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
e900: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
e910: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
e920: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
e930: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
e940: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
e950: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
e960: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
e970: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
e980: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
e990: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
e9a0: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
e9b0: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
e9c0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
e9d0: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
e9e0: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
e9f0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
ea00: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
ea10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
ea20: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
ea30: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
ea40: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
ea50: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
ea60: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
ea70: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
ea80: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
ea90: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
eaa0: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
eab0: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
eac0: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
ead0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
eae0: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
eaf0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
eb00: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
eb10: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
eb20: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
eb30: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
eb40: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
eb50: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
eb60: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
eb70: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
eb80: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
eb90: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
eba0: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
ebb0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
ebc0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
ebd0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
ebe0: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
ebf0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
ec00: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
ec10: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
ec20: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
ec30: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
ec40: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
ec50: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
ec60: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
ec70: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
ec80: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
ec90: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
eca0: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
ecb0: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
ecc0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
ecd0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
ece0: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
ecf0: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
ed00: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
ed10: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
ed20: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
ed30: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
ed40: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ed50: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ed60: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
ed70: 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41  | !MEMDB );.  PA
ed80: 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
ed90: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
eda0: 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
edc0: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
edd0: 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
ede0: 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
edf0: 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a  geSize, aData),.
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
ee10: 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
ee20: 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
ee30: 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
ee40: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
ee50: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
ee60: 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67  SIVE).   && (pPg
ee70: 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
ee80: 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
ee90: 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73  _SYNC)).   && is
eea0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
eeb0: 0a 20 20 20 26 26 20 21 69 73 55 6e 73 79 6e 63  .   && !isUnsync
eec0: 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
eed0: 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
eee0: 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
eef0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
ef00: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
ef10: 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20  ger->fd, aData, 
ef20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ef30: 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
ef40: 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
ef50: 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
ef60: 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
ef70: 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
ef80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61   }.    sqlite3Ba
ef90: 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
efa0: 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
efb0: 2c 20 61 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  , aData);.  }els
efc0: 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
efd0: 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
efe0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
eff0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
f000: 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
f010: 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
f020: 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
f030: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
f040: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
f050: 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
f060: 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
f070: 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
f080: 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
f090: 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
f0a0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
f0b0: 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
f0c0: 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
f0d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f0e0: 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
f0f0: 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
f100: 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
f110: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
f120: 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
f130: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
f140: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
f150: 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
f160: 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
f170: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
f180: 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
f190: 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
f1a0: 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
f1b0: 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
f1c0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
f1d0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f1e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
f1f0: 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
f200: 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
f210: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
f220: 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
f230: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
f240: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
f250: 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
f260: 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
f270: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
f280: 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
f290: 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
f2a0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
f2b0: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
f2c0: 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
f2d0: 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
f2e0: 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
f2f0: 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
f300: 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
f310: 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
f320: 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
f330: 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
f340: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
f350: 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
f360: 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d  );.    if( (rc =
f370: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
f380: 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e  uire(pPager, pgn
f390: 6f 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51  o, &pPg, 1))!=SQ
f3a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f3b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f3c0: 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  }.    pPg->flags
f3d0: 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
f3e0: 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
f3f0: 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
f400: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
f410: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
f420: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
f430: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
f440: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
f450: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
f460: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
f470: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
f480: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
f490: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
f4a0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
f4b0: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
f4c0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
f4d0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
f4e0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
f4f0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
f500: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
f510: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
f520: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
f530: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
f540: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
f550: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
f560: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
f570: 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
f580: 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
f590: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
f5a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
f5b0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
f5c0: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
f5d0: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
f5e0: 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 7d  iter(pPg);.    }
f5f0: 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
f600: 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
f610: 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
f620: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f630: 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
f640: 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
f650: 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
f660: 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
f670: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
f680: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
f690: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
f6a0: 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
f6b0: 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
f6c0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
f6d0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
f6e0: 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
f6f0: 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
f700: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
f710: 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
f720: 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
f730: 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
f740: 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
f750: 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20   the..      **. 
f760: 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
f770: 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74   one exception t
f780: 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20  o this rule. If 
f790: 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
f7a0: 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a  g rolled.      *
f7b0: 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f  * back as part o
f7c0: 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f  f a savepoint (o
f7d0: 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c  r statement) rol
f7e0: 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20  lback from an . 
f7f0: 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64       ** unsynced
f800: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
f810: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
f820: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  e, then it is no
f830: 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20  t safe.      ** 
f840: 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
f850: 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20   as clean. This 
f860: 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69  is because marki
f870: 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20  ng the page as. 
f880: 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69       ** clean wi
f890: 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  ll clear the PGH
f8a0: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
f8b0: 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  g. Since the pag
f8c0: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c  e is.      ** al
f8d0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
f8e0: 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72  rnal file (recor
f8f0: 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  ded in Pager.pIn
f900: 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20  Journal) and.   
f910: 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
f920: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
f930: 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68  s cleared, if th
f940: 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
f950: 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67  n to.      ** ag
f960: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
f970: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
f980: 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61  will be marked a
f990: 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20  s dirty but.    
f9a0: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
f9b0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69  EED_SYNC flag wi
f9c0: 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49  ll not be set. I
f9d0: 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74  t could then pot
f9e0: 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a  entially.      *
f9f0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  * be written out
fa00: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
fa10: 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69  se file before i
fa20: 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ts journal file.
fa30: 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
fa40: 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61   is synced. If a
fa50: 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75   crash occurs du
fa60: 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  ring or followin
fa70: 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a  g this,.      **
fa80: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
fa90: 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a  tion may ensue..
faa0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
fab0: 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
fac0: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
fad0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
fae0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
faf0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
fb00: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
fb10: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
fb20: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
fb30: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
fb40: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
fb50: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
fb60: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
fb70: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
fb80: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
fb90: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
fba0: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
fbb0: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
fbc0: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
fbd0: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
fbe0: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
fbf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
fc00: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
fc10: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
fc20: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
fc30: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
fc40: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
fc50: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
fc60: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
fc70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
fc80: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
fc90: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
fca0: 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
fcb0: 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EST)./*.** This 
fcc0: 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68  routine looks ah
fcd0: 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ead into the mai
fce0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
fcf0: 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a  nd determines.**
fd00: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
fd10: 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20  the next record 
fd20: 28 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74  (the record that
fd30: 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a   begins at file.
fd40: 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  ** offset pPager
fd50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73  ->journalOff) is
fd60: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70   a well-formed p
fd70: 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69  age record consi
fd80: 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61  sting.** of a va
fd90: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c  lid page number,
fda0: 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65   pPage->pageSize
fdb0: 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   bytes of conten
fdc0: 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62  t, followed.** b
fdd0: 79 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73  y a valid checks
fde0: 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  um..**.** The pa
fdf0: 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ger never needs 
fe00: 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20  to know this in 
fe10: 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20  order to do its 
fe20: 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72  job.   This.** r
fe30: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
fe40: 73 65 64 20 66 72 6f 6d 20 77 69 74 68 20 61 73  sed from with as
fe50: 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
fe60: 61 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f  ase() macros..*/
fe70: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
fe80: 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65  rNextJournalPage
fe90: 49 73 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70  IsValid(Pager *p
fea0: 50 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70  Pager){.  Pgno p
feb0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  gno;           /
fec0: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
fed0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  r of the page */
fee0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
fef0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ff00: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  age checksum */.
ff10: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ff20: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
ff30: 20 63 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20   code from read 
ff40: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
ff50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
ff60: 3b 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65  ;    /* The file
ff70: 20 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d   descriptor from
ff80: 20 77 68 69 63 68 20 77 65 20 61 72 65 20 72 65   which we are re
ff90: 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  ading */.  u8 *a
ffa0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
ffb0: 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
ffc0: 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e page */..  /* 
ffd0: 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
ffe0: 6d 62 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20  mber header */. 
fff0: 20 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66   fd = pPager->jf
10000 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
10010 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d  bits(fd, pPager-
10020 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67  >journalOff, &pg
10030 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
10040 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
10050 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10080 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d  ST*/.  if( pgno=
10090 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
100a0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
100b0 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ) ){ return 0; }
100c0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
100d0 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ST*/.  if( pgno>
100e0 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
100f0 53 69 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30  Size ){ return 0
10100 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
10110 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10120 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ST*/..  /* Read 
10130 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  the checksum */.
10140 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
10150 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  s(fd, pPager->jo
10160 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d  urnalOff+pPager-
10170 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
10180 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
10190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
101a0 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
101d0 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  EST*/..  /* Read
101e0 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 76 65   the data and ve
101f0 72 69 66 79 20 74 68 65 20 63 68 65 63 6b 73 75  rify the checksu
10200 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28  m */.  aData = (
10210 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
10220 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71  Space;.  rc = sq
10230 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
10240 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
10250 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
10260 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a  >journalOff+4);.
10270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10280 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  _OK ){ return 0;
10290 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
102c0 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
102d0 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
102e0 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72  !=cksum ){ retur
102f0 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
10300 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
10310 0a 20 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73  .  /* Reach this
10320 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74   point only if t
10330 68 65 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  he page is valid
10340 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
10350 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
10360 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
10370 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
10380 4f 56 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f  OVERAGE_TEST) */
10390 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
103a0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
103b0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
103c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
103d0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
103e0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
103f0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
10400 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10410 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
10420 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
10430 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
10440 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
10450 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
10460 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10470 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
10480 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
10490 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
104a0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
104b0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
104c0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
104d0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
104e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
104f0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
10500 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
10510 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
10520 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
10530 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
10540 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
10550 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
10560 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
10570 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
10580 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
10590 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
105a0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
105b0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
105c0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
105d0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
105e0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
105f0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
10600 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
10610 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
10620 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
10630 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
10640 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
10650 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
10660 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
10670 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
10680 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
10690 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
106a0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
106b0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
106c0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
106d0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
106e0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
106f0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
10700 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
10710 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
10720 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
10730 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10740 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10750 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
10760 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
10770 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
10780 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
10790 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
107a0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
107b0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
107c0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
107d0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
107e0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
107f0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
10800 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10810 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
10820 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
10830 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
10840 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
10850 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10860 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10870 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10880 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10890 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
108a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
108b0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
108c0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
108d0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
108e0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
108f0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
10900 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
10910 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
10920 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
10930 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
10940 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
10950 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10960 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10970 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10980 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10990 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
109a0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
109b0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
109c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
109d0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
109e0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
109f0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
10a00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
10a10 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
10a20 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
10a30 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
10a40 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
10a50 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10a60 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10a70 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10a80 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10a90 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10aa0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
10ab0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10ac0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
10ad0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
10ae0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
10af0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
10b00 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
10b10 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
10b20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10b30 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
10b40 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10b50 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10b60 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10b70 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10b80 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10bb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10bc0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
10bd0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
10be0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
10bf0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
10c00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10c10 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10c20 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10c30 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10c40 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10c50 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10c60 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10c70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10c80 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10c90 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10ca0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
10cb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10cc0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
10cd0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
10ce0 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
10cf0 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
10d00 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10d10 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10d20 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10d30 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10d40 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10d50 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10d60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10d70 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10d80 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10d90 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10da0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10db0 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
10dc0 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
10dd0 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
10de0 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
10df0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
10e10 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
10e20 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10e30 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
10e40 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
10e50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10e60 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
10e70 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
10e80 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
10e90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ea0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
10eb0 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
10ec0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10ed0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
10ee0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
10ef0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10f00 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10f10 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
10f20 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
10f30 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
10f40 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
10f50 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
10f60 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
10f70 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
10f80 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
10f90 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
10fa0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10fb0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
10fc0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
10fd0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
10fe0 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
10ff0 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
11000 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
11010 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
11020 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
11030 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
11040 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
11050 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
11060 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
11070 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
11080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11090 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
110a0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
110b0 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
110c0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
110d0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
110e0 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
110f0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
11100 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
11110 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
11120 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
11130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11140 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
11150 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
11160 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
11170 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
11180 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
11190 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
111a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
111b0 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74  .      int exist
111c0 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  s;.      rc = sq
111d0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
111e0 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
111f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
11200 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
11210 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11230 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11240 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
11250 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
11260 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
11270 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
11280 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
11290 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
112a0 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
112b0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
112c0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
112d0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
112e0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
112f0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
11300 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
11310 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
11320 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
11330 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11340 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
11350 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
11360 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
11370 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
11380 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
11390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
113a0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
113b0 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
113c0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
113d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
113e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
113f0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
11400 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11410 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
11420 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11430 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
11440 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
11450 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
11460 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
11470 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
11480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
114a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
114b0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
114c0 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
114d0 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
114e0 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
114f0 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
11500 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
11510 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
11520 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
11530 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
11540 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11550 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
11560 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11570 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
11580 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
11590 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
115a0 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
115b0 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
115c0 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
115d0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
115e0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
115f0 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
11600 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
11610 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
11620 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
11630 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
11640 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
11650 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11660 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
11670 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
11680 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a  Journal) );.  }.
11690 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
116a0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
116b0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
116c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
116d0 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
116e0 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
116f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11700 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
11710 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
11720 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
11730 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
11740 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
11750 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
11760 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
11770 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
11780 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
11790 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
117a0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
117b0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
117c0 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  en, or an exclus
117d0 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a  ive lock is not.
117e0 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  ** held, this fu
117f0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11800 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
11810 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
11820 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64  le is.** changed
11830 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
11840 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
11850 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
11860 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f  If the file.** o
11870 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
11880 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
11890 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
118a0 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
118b0 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
118c0 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
118d0 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
118e0 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
118f0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
11900 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
11910 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
11920 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
11930 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
11940 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
11950 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
11960 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
11970 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
11980 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
11990 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
119a0 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
119b0 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
119c0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
119d0 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
119e0 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
119f0 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
11a00 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
11a10 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
11a20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
11a30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
11a40 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
11a50 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
11a60 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
11a70 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
11a80 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
11a90 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11aa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11ab0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
11ac0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11ad0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
11ae0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11af0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
11b00 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
11b10 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50  IVE && isOpen(pP
11b20 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
11b30 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
11b40 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f  , newSize;.    /
11b50 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
11b60 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
11b70 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
11b80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11b90 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
11ba0 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
11bb0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
11bc0 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  wSize = pPager->
11bd0 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
11be0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
11bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
11c00 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
11c10 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
11c20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
11c30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11c40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
11c50 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
11c60 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
11c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
11c90 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
11ca0 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d   "", 1, newSize-
11cb0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
11cc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11cd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
11ce0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
11cf0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
11d00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
11d10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11d20 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
11d30 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
11d40 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
11d50 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
11d60 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
11d70 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
11d80 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
11d90 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
11da0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
11db0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
11dc0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
11dd0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
11de0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
11df0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
11e00 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
11e10 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
11e20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11e30 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
11e40 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
11e50 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
11e60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
11e70 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
11e80 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
11e90 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
11ea0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
11eb0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
11ec0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
11ed0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
11ee0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
11ef0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
11f00 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
11f10 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
11f20 20 75 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a   up to 512 if.**
11f30 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
11f40 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64   512, or rounded
11f50 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
11f60 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
11f70 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
11f80 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
11f90 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
11fa0 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
11fb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11fc0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
11fd0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
11fe0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11ff0 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
12000 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
12010 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
12020 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
12030 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
12040 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
12050 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
12060 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
12070 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
12080 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
12090 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
120a0 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
120b0 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
120c0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
120d0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
120e0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
120f0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
12100 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
12110 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
12120 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12130 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
12140 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
12150 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
12160 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
12170 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
12180 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
12190 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
121a0 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
121b0 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
121c0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
121d0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
121e0 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
121f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
12200 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
12210 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
12220 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
12230 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
12240 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12250 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
12260 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
12270 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
12280 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
12290 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
122a0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
122b0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
122c0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
122d0 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
122e0 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
122f0 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
12300 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
12310 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
12320 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
12330 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
12340 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
12350 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
12360 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
12370 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
12380 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
12390 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
123a0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
123b0 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
123c0 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
123d0 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
123e0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
123f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
12400 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
12410 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
12420 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
12430 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
12440 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
12450 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
12460 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
12470 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
12480 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
12490 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
124a0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
124b0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
124c0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
124d0 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
124e0 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
124f0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
12500 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12510 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
12520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
12530 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
12540 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
12550 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
12560 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
12570 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
12580 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
12590 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
125a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
125b0 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
125c0 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
125d0 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
125e0 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
125f0 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
12600 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
12610 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
12620 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
12630 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
12640 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
12650 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
12660 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
12670 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
12680 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
12690 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
126a0 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
126b0 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
126c0 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
126d0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
126e0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
126f0 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
12700 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12710 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
12720 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
12730 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
12740 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
12750 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12760 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
12770 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
12780 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
12790 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
127a0 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
127b0 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
127c0 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
127d0 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
127e0 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
127f0 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
12800 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12810 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
12820 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
12830 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
12840 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
12850 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
12860 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
12870 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
12890 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
128a0 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
128b0 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
128c0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
128d0 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
128e0 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
128f0 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
12900 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12910 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
12920 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
12930 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
12940 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
12950 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
12960 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
12970 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
12980 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
12990 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
129a0 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
129b0 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
129c0 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
129d0 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
129e0 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
129f0 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
12a00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
12a10 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
12a20 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
12a30 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
12a40 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
12a50 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12a60 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
12a70 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
12a80 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
12a90 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
12aa0 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
12ab0 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
12ac0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
12ad0 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
12ae0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
12af0 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
12b00 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
12b10 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
12b20 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
12b30 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
12b40 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
12b50 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
12b60 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
12b70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
12b80 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
12b90 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
12ba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
12bb0 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
12bc0 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
12bd0 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
12be0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
12bf0 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
12c00 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
12c10 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
12c20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12c30 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
12c40 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
12c50 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
12c60 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
12c70 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
12c80 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
12c90 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
12ca0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
12cb0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
12cc0 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
12cd0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
12ce0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
12cf0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
12d00 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
12d10 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
12d20 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
12d30 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
12d40 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
12d50 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
12d60 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
12d70 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
12d80 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
12d90 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
12da0 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
12db0 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
12dc0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
12dd0 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
12de0 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
12df0 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
12e00 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
12e10 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
12e20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
12e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12e40 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
12e50 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
12e60 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
12e70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
12e80 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
12e90 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
12ea0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
12eb0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
12ec0 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
12ef0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
12f00 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
12f10 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
12f20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12f30 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
12f40 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
12f50 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
12f60 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
12f70 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
12f80 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
12f90 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
12fa0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
12fb0 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
12fc0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12ff0 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
13000 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
13010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13020 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
13030 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
13040 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
13050 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
13060 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
13070 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13080 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
13090 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
130a0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
130b0 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
130c0 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
130d0 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
130e0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
130f0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
13100 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
13110 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
13120 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
13130 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
13140 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
13150 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13160 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13170 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
13180 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
13190 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
131a0 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
131b0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
131c0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
131d0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
131e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
131f0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
13200 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
13210 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
13220 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13230 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
13240 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
13250 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
13260 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
13270 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
13280 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
13290 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
132a0 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
132b0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
132c0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
132d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
132e0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
132f0 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
13300 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
13310 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
13320 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
13330 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
13340 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
13350 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
13360 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
13370 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13380 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
13390 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
133a0 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
133b0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
133c0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
133d0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
133e0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
133f0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
13400 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
13410 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
13420 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
13430 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
13440 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
13450 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
13460 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13470 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
13480 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
13490 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
134a0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
134b0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
134c0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
134d0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
134e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
134f0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
13500 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
13510 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
13520 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13530 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
13540 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
13550 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
13560 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
13570 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
13580 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
13590 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
135a0 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
135b0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
135c0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
135d0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
135e0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
135f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73  ){.    int isUns
13600 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
13610 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
13620 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
13630 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
13640 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
13650 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
13660 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
13670 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
13680 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
13690 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
136a0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
136b0 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
136c0 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
136d0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
136e0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
136f0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
13700 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
13710 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
13730 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
13740 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
13750 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
13760 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13770 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
13780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
13790 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
137a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
137b0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
137c0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
137d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
137e0 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
137f0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
13800 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
13810 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
13820 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
13830 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
13840 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
13850 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
13860 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
13870 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
13880 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
13890 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
138a0 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
138b0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
138c0 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
138d0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
138e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
138f0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
13900 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
13910 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13920 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
13930 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
13940 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
13950 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
13960 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
13970 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
13980 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
13990 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
139a0 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
139b0 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
139c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
139d0 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
139e0 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
139f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
13a00 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
13a10 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
13a20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
13a30 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
13a40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
13a50 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
13a60 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
13a70 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
13a80 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
13a90 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
13aa0 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
13ab0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
13ac0 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
13ad0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
13ae0 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
13af0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
13b00 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
13b10 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
13b20 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
13b30 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
13b40 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
13b50 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
13b60 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
13b70 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
13b80 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
13b90 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
13ba0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
13bb0 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
13bc0 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
13bd0 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
13be0 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
13bf0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
13c00 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
13c10 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13c20 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
13c30 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
13c40 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
13c50 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
13c60 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
13c70 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
13c80 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
13c90 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
13ca0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
13cb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
13cc0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65  e..    */.    te
13cd0 73 74 63 61 73 65 28 20 6e 52 65 63 3d 3d 30 20  stcase( nRec==0 
13ce0 26 26 20 21 69 73 48 6f 74 0a 20 20 20 20 20 20  && !isHot.      
13cf0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
13d00 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
13d10 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21  _HDR_SZ(pPager)!
13d20 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
13d30 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20  Off.         && 
13d40 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
13d50 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
13d60 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13d70 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20  er))>0.         
13d80 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72  && pagerNextJour
13d90 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70  nalPageIsValid(p
13da0 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
13db0 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
13dc0 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
13dd0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13de0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
13df0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
13e00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13e10 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
13e20 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
13e30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13e40 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
13e50 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
13e60 20 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a    isUnsync = 1;.
13e70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
13e80 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
13e90 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
13ea0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
13eb0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
13ec0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
13ed0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
13ee0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
13ef0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
13f00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13f10 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
13f20 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
13f30 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
13f40 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
13f50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
13f60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13f70 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
13f80 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
13f90 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13fa0 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
13fb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
13fc0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
13fd0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
13fe0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
13ff0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
14000 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
14010 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
14020 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
14030 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
14040 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
14050 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
14060 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
14070 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14080 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
14090 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
140a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
140b0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
140c0 28 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79  (pPager,1,isUnsy
140d0 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  nc,&pPager->jour
140e0 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20  nalOff,0,0);.   
140f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
14120 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
14130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14140 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
14150 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14160 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
14170 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
14180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
14190 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
141a0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
141b0 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
141c0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
141d0 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
141e0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
141f0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
14200 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
14210 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
14220 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
14230 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
14240 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
14250 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
14260 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
14270 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
14280 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
14290 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
142a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
142b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
142c0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
142d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
142e0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
142f0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
14300 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
14310 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
14320 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
14330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14340 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
14350 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
14360 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
14370 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
14380 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
14390 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
143a0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
143b0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
143c0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
143d0 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
143e0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
143f0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
14400 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
14410 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
14420 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
14430 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
14440 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
14450 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
14460 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
14470 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
14480 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
14490 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
144a0 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
144b0 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
144c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
144d0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
144e0 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
144f0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
14500 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
14510 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
14520 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
14530 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
14540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
14550 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
14560 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
14570 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
14580 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
14590 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
145a0 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
145b0 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
145c0 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
145d0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
145e0 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
145f0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
14600 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
14610 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
14620 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
14630 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
14640 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
14650 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
14660 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
14670 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
14680 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
14690 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
146a0 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
146b0 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
146c0 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
146d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
146e0 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
146f0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
14700 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
14710 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
14720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14730 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
14740 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
14750 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
14760 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
14770 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
14780 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
14790 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
147a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
147b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
147c0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
147d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
147e0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
147f0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
14800 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
14810 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0');.    testcas
14820 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
14830 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
14840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
14850 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
14860 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
14870 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
14880 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
14890 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
148a0 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
148b0 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
148c0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
148d0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
148e0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
148f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
14900 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
14910 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
14920 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14930 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
14940 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
14950 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
14960 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
14970 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
14980 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
14990 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
149a0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
149b0 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
149c0 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
149d0 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
149e0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
149f0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
14a00 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
14a10 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
14a20 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
14a30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
14a40 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
14a50 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
14a60 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
14a70 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
14a80 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
14a90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14aa0 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
14ab0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
14ac0 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
14ad0 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
14ae0 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
14af0 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
14b00 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
14b10 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
14b20 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
14b30 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
14b40 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
14b50 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
14b60 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
14b70 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
14b80 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
14b90 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
14ba0 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
14bb0 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
14bc0 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
14bd0 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
14be0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
14bf0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
14c00 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
14c10 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
14c20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
14c30 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
14c40 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
14c50 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
14c60 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
14c70 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
14c80 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
14c90 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14ca0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
14cb0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14cc0 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
14cd0 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
14ce0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14cf0 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
14d00 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
14d10 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
14d20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
14d30 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
14d40 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
14d50 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
14d60 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
14d70 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
14d80 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
14d90 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14da0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
14db0 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
14dc0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
14dd0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
14de0 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
14df0 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
14e00 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14e10 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
14e20 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
14e30 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
14e40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
14e50 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
14e60 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
14e70 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
14e80 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
14e90 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
14ea0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
14eb0 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
14ec0 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
14ed0 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
14ee0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
14ef0 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
14f00 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
14f10 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
14f20 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
14f30 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
14f40 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
14f50 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
14f60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
14f70 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
14f80 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
14f90 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
14fa0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14fb0 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
14fc0 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
14fd0 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
14fe0 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
14ff0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
15000 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
15010 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
15020 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
15030 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
15040 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
15050 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
15060 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
15070 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
15080 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
15090 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
150a0 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
150b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
150c0 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
150d0 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
150e0 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
150f0 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
15100 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
15110 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
15120 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
15130 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
15140 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
15150 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
15160 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
15170 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
15180 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
15190 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
151a0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
151b0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
151c0 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
151d0 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
151e0 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
151f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15200 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
15210 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
15220 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
15230 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
15240 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
15250 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
15260 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
15270 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15280 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
15290 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
152a0 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
152b0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
152c0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
152d0 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
152e0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
152f0 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
15300 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
15310 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
15320 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
15330 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15340 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15350 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
15360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
15370 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
15380 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
15390 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
153a0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
153b0 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
153c0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
153d0 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
153e0 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
153f0 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
15400 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a  r->dbOrigSize;..
15410 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
15420 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
15430 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
15440 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
15450 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
15460 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
15470 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
15480 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
15490 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
154a0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
154b0 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
154c0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
154d0 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
154e0 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
154f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
15500 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
15510 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
15520 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15530 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
15540 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
15550 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
15560 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
15570 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
15580 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
15590 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
155a0 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
155b0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
155c0 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
155d0 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
155e0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
155f0 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
15600 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
15610 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
15620 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
15630 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
15640 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
15650 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
15660 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
15670 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
15680 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
15690 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
156a0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
156b0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
156c0 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
156d0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
156e0 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
156f0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
15700 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
15710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
15720 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
15730 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
15740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15750 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15760 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
15770 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15780 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15790 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c  ge(pPager, 1, 0,
157a0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
157b0 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b  lOff, 1, pDone);
157c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
157d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
157e0 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
157f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15800 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
15810 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
15820 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
15830 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
15840 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
15850 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
15860 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
15870 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
15880 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
15890 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
158a0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
158b0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
158c0 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
158d0 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
158e0 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
158f0 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
15900 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
15910 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
15920 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
15930 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
15940 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
15950 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
15960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15970 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
15980 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
15990 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
159a0 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
159b0 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
159c0 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
159d0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
159e0 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
159f0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
15a00 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15a10 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
15a20 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
15a30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
15a40 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
15a50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
15a60 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
15a70 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
15a80 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
15a90 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
15aa0 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
15ab0 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
15ac0 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
15ad0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15ae0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
15af0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28  /.    assert( !(
15b00 6e 4a 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20  nJRec==0.       
15b10 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
15b20 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
15b30 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d  HDR_SZ(pPager)!=
15b40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15b50 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ff.         && (
15b60 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
15b70 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
15b80 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
15b90 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26  r))>0.         &
15ba0 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  & pagerNextJourn
15bb0 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50  alPageIsValid(pP
15bc0 61 67 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20  ager)).    );.  
15bd0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
15be0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
15bf0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
15c00 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
15c10 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
15c20 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
15c30 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
15c40 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
15c50 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
15c60 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
15c70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
15c80 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
15c90 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
15ca0 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
15cb0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
15cc0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
15cd0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
15ce0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
15cf0 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  , 0, &pPager->jo
15d00 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f  urnalOff, 1, pDo
15d10 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
15d20 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15d30 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
15d40 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15d50 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
15d60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
15d70 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
15d80 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
15d90 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
15da0 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
15db0 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
15dc0 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
15dd0 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
15de0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
15df0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
15e00 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
15e10 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
15e20 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
15e30 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
15e40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
15e50 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
15e60 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
15e70 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15e80 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
15e90 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
15ea0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
15eb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15ec0 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
15ed0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
15ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15ef0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
15f00 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
15f10 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
15f20 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  ==ii*(4+pPager->
15f30 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
15f40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
15f50 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15f60 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f  pPager, 0, 0, &o
15f70 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29  ffset, 1, pDone)
15f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15f90 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15fa0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
15fb0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
15fc0 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
15fd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15fe0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
15ff0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
16000 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16020 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
16030 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
16040 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
16050 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
16060 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16070 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
16080 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
16090 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
160a0 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
160b0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
160c0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
160d0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
160e0 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
160f0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
16100 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
16110 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
16120 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
16130 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
16140 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
16150 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
16160 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
16170 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
16180 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
16190 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
161a0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
161b0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
161c0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
161d0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
161e0 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
161f0 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
16200 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
16210 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
16220 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
16230 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
16240 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
16250 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
16260 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
16270 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
16280 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
16290 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
162a0 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
162b0 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
162c0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
162d0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
162e0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
162f0 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
16300 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
16310 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
16320 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
16330 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
16340 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
16350 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
16360 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
16370 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
16380 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
16390 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
163a0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
163b0 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
163c0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
163d0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
163e0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
163f0 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
16400 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
16410 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
16420 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
16430 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
16440 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
16450 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
16460 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
16470 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16480 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
16490 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
164a0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
164b0 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
164c0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
164d0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
164e0 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
164f0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
16500 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
16510 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
16520 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
16530 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
16540 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
16550 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
16560 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
16570 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
16580 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
16590 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
165a0 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
165b0 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
165c0 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
165d0 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
165e0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
165f0 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
16600 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
16610 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
16620 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
16630 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
16640 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
16650 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
16660 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
16670 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
16680 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
16690 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
166a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
166b0 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
166c0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62  >sync_flags = (b
166d0 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45  FullFsync?SQLITE
166e0 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54  _SYNC_FULL:SQLIT
166f0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
16700 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
16710 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
16720 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
16730 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
16740 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
16750 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
16760 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
16770 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
16780 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
16790 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
167a0 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
167b0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
167c0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
167d0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
167e0 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
167f0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
16800 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
16810 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
16820 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
16830 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
16840 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
16850 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
16860 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
16870 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
16880 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
16890 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
168a0 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
168b0 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
168c0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
168d0 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
168e0 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
168f0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
16900 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
16910 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
16920 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
16930 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
16940 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
16950 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
16960 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
16970 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16980 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16990 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
169a0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
169b0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
169c0 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
169d0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
169e0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
169f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16a00 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
16a10 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
16a20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
16a30 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
16a40 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
16a50 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
16a60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
16a70 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
16a80 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
16a90 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
16aa0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
16ab0 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
16ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16ad0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16ae0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16af0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
16b00 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
16b10 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
16b20 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
16b30 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
16b40 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
16b50 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
16b60 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
16b70 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
16b80 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16b90 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
16ba0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16bb0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
16bc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
16bd0 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
16be0 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
16bf0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
16c00 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
16c10 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
16c20 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
16c30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
16c40 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
16c50 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
16c60 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
16c70 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
16c80 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
16c90 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
16ca0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
16cb0 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
16cc0 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
16cd0 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
16ce0 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
16cf0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
16d00 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
16d10 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
16d20 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
16d30 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
16d40 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
16d50 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
16d60 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
16d70 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
16d80 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
16d90 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
16da0 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
16db0 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
16dc0 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
16dd0 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
16de0 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
16df0 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e10 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
16e20 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
16e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e60 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
16e70 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
16e80 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
16e90 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
16ea0 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
16eb0 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
16ec0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
16ed0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
16ee0 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
16ef0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
16f00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
16f10 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
16f20 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
16f30 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
16f40 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
16f50 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
16f60 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
16f70 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
16f80 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
16f90 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
16fa0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
16fb0 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
16fc0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
16fd0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
16fe0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
16ff0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17010 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
17020 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
17030 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
17040 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
17050 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
17060 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
17070 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
17080 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170a0 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
170b0 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
170c0 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67  r */.){  .  pPag
170d0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
170e0 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
170f0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
17100 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
17110 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a  syHandlerArg;.}.
17120 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
17130 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
17140 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 66 20   this pager. If 
17150 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
17160 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
17170 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
17180 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
17190 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
171a0 6d 6f 64 69 66 69 65 64 20 28 72 65 73 74 6f 72  modified (restor
171b0 65 64 29 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  ed).** as part o
171c0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
171d0 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
171e0 6c 62 61 63 6b 2e 20 54 68 65 20 63 61 6c 6c 62  lback. The callb
171f0 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a 20 68 69  ack gives .** hi
17200 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 20  gher-level code 
17210 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
17220 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
17230 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 0a  TRA section to .
17240 2a 2a 20 61 67 72 65 65 20 77 69 74 68 20 74 68  ** agree with th
17250 65 20 72 65 73 74 6f 72 65 64 20 70 61 67 65 20  e restored page 
17260 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
17270 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
17280 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
17290 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
172a0 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a  nit)(DbPage*)){.
172b0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
172c0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
172d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
172e0 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
172f0 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
17300 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
17310 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
17320 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
17330 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
17340 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
17350 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
17360 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
17370 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
17380 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
17390 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
173a0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
173b0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
173c0 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
173d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
173e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72  QLITE_CORRUPT or
173f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
17400 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
17410 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
17420 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
17430 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
17440 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
17450 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
17460 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
17470 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
17480 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
17490 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
174a0 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
174b0 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
174c0 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
174d0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
174e0 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
174f0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
17500 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
17510 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
17520 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
17530 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
17540 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
17550 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
17560 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
17570 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
17580 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
17590 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
175a0 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
175b0 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
175c0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
175d0 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
175e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
175f0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
17600 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
17610 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
17620 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
17630 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
17640 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
17650 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
17660 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
17670 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
17680 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
17690 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
176a0 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
176b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
176c0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
176d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
176e0 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
176f0 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
17700 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
17710 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
17720 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
17730 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
17740 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
17750 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
17760 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
17770 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
17780 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
17790 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
177a0 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
177b0 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
177c0 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
177d0 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
177e0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
177f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17800 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
17810 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36  ger *pPager, u16
17820 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20   *pPageSize){.  
17830 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
17840 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
17850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17860 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a  .    u16 pageSiz
17870 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
17880 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
17890 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
178a0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
178b0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
178c0 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
178d0 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
178e0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50   && pageSize!=pP
178f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
17900 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
17910 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
17920 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
17930 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
17940 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
17950 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
17960 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
17970 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
17980 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
17990 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
179a0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
179b0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
179c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
179d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
179e0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
179f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
17a00 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
17a10 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
17a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
17a30 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
17a40 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
17a50 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
17a60 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
17a70 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
17a80 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
17a90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
17aa0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17ab0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61  }.    }.    *pPa
17ac0 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50  geSize = (u16)pP
17ad0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
17ae0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17b00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17b10 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
17b20 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
17b30 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
17b40 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
17b50 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
17b60 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
17b70 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
17b80 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
17b90 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
17ba0 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
17bb0 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
17bc0 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
17bd0 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
17be0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
17bf0 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
17c00 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
17c10 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
17c20 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
17c30 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
17c40 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
17c50 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
17c60 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
17c70 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
17c80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17c90 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
17ca0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
17cb0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
17cc0 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
17cd0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
17ce0 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
17cf0 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
17d00 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
17d10 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
17d20 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
17d30 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
17d40 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
17d50 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
17d60 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
17d70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17d80 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
17d90 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
17da0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
17db0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
17dc0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
17dd0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
17de0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
17df0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
17e00 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
17e10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
17e20 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
17e30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
17e40 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
17e50 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  er, 0);.  return
17e60 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
17e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
17e80 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
17e90 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
17ea0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
17eb0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
17ec0 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
17ed0 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
17ee0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
17ef0 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
17f00 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
17f10 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
17f20 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
17f30 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
17f40 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
17f50 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
17f60 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
17f70 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
17f80 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
17f90 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
17fa0 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
17fb0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
17fc0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
17fd0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
17fe0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
17ff0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
18000 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
18010 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
18020 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
18030 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
18040 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
18050 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
18060 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
18070 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
18080 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
18090 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
180a0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
180b0 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
180c0 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
180d0 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
180e0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
180f0 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
18100 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
18110 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
18120 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
18130 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
18140 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
18150 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
18160 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
18170 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
18180 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
18190 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
181a0 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
181b0 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
181c0 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
181d0 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
181e0 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
181f0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
18200 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
18210 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
18220 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
18230 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
18240 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
18250 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
18260 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
18270 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
18280 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
18290 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
182a0 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
182b0 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
182c0 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
182d0 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
182e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
182f0 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
18300 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
18310 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
18320 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
18330 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
18340 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
18350 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
18360 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
18370 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
18380 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
18390 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
183a0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
183b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
183c0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
183d0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
183e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
183f0 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
18400 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
18410 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18420 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
18430 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69 66 28 20  mpFile );.  if( 
18440 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18450 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
18460 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
18470 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
18480 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
18490 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
184a0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
184b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
184c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
184d0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
184e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
184f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18500 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18510 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
18520 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18530 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
18540 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
18550 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72   .** with pPager
18560 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  . Normally, this
18570 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61   is calculated a
18580 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65  s (<db file size
18590 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a  >/<page-size>)..
185a0 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
185b0 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
185c0 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
185d0 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
185e0 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
185f0 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
18600 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
18610 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
18620 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74  r is in error st
18630 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
18640 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
18650 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72  , then the.** er
18660 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
18670 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18680 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66   and *pnPage lef
18690 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c  t unchanged. Or,
186a0 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20  .** if the file 
186b0 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65  system has to be
186c0 20 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65   queried for the
186d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
186e0 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65  e and.** the que
186f0 72 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72  ry attempt retur
18700 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20  ns an IO error, 
18710 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
18720 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
18730 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
18740 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
18750 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
18760 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
18770 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  s successful, th
18780 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
18790 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
187a0 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74  *pnPage is set t
187b0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
187c0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
187d0 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
187e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
187f0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
18800 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
18810 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18830 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
18840 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
18850 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
18860 72 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  r is already in 
18870 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
18880 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
18890 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28  r code. */.  if(
188a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
188b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
188c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
188d0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
188e0 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
188f0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
18900 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20  ile. Store this 
18910 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69  in nPage. */.  i
18920 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
18930 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50  eValid ){.    nP
18940 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  age = pPager->db
18950 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
18960 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
18970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
18980 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ror returned by 
18990 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
189a0 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
189b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
189c0 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ile size in byte
189d0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  s returned by Os
189e0 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20  FileSize() */.. 
189f0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
18a00 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
18a10 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
18a20 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
18a30 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18a40 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  && (0 != (rc = s
18a50 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
18a60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
18a70 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  )) ){.      page
18a80 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
18a90 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
18aa0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18ab0 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
18ac0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
18ad0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31  .      nPage = 1
18ae0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18af0 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
18b00 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  )(n / pPager->pa
18b10 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
18b20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
18b30 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
18b40 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
18b50 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
18b60 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
18b70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
18b80 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
18b90 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
18ba0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
18bb0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
18bc0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
18bd0 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
18be0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
18bf0 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67  the .  ** config
18c00 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
18c10 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
18c20 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
18c30 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
18c40 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
18c50 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
18c60 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
18c70 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
18c80 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
18c90 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
18ca0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
18cb0 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
18cc0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18cd0 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e  E_OK */.  if( pn
18ce0 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50  Page ){.    *pnP
18cf0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d  age = nPage;.  }
18d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18d10 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
18d20 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
18d30 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
18d40 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
18d50 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
18d60 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
18d70 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
18d80 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
18d90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
18da0 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
18db0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
18dc0 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
18dd0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
18de0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
18df0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
18e00 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
18e10 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
18e20 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
18e30 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
18e40 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
18e50 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
18e60 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
18e70 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
18e80 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
18e90 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
18ea0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
18eb0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
18ec0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18ed0 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
18ee0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
18ef0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
18f00 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
18f10 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
18f20 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
18f30 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
18f40 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
18f50 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
18f60 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
18f70 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
18f80 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
18f90 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
18fa0 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
18fb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18fe0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
18ff0 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
19000 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
19010 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
19020 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
19030 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
19040 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
19050 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
19060 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
19070 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
19080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
19090 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
190a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
190b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
190c0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
190d0 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
190e0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
190f0 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
19100 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19110 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
19120 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
19130 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20  eValid==0 );..  
19140 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
19150 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
19160 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
19170 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
19180 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
19190 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
191a0 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
191b0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
191c0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
191d0 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
191e0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
191f0 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
19200 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
19210 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
19220 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
19230 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
19240 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  tate>=locktype).
19250 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
19260 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
19270 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  UNLOCK && lockty
19280 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  pe==PAGER_SHARED
19290 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
192a0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
192b0 52 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f  R_RESERVED && lo
192c0 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58  cktype==PAGER_EX
192d0 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20  CLUSIVE).  );.. 
192e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
192f0 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
19300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19310 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
19320 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
19330 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
19340 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
19350 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
19360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
19370 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
19380 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
19390 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
193a0 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  g) );.    if( rc
193b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
193c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
193d0 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  te = (u8)locktyp
193e0 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  e;.      IOTRACE
193f0 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
19400 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  , pPager, lockty
19410 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pe)).    }.  }. 
19420 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19430 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
19440 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
19450 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
19460 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
19470 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
19480 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
19490 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
194a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
194b0 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
194c0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
194d0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
194e0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
194f0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
19500 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
19510 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
19520 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
19530 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
19540 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19550 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
19560 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
19570 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
19580 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19590 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
195a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
195b0 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
195c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
195d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
195e0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
195f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
19600 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nPage;.}../*.**
19610 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
19620 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
19630 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
19640 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
19650 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
19660 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
19670 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
19680 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19690 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
196a0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
196b0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
196c0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
196d0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
196e0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
196f0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
19700 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
19710 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
19720 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
19730 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
19740 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
19750 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
19760 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
19770 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
19780 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19790 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
197a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
197b0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
197c0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
197d0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
197e0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
197f0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
19800 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
19810 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
19820 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
19830 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
19840 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
19850 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
19860 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
19870 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
19880 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19890 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
198a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
198b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
198c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
198d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
198e0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
198f0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
19900 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
19910 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
19920 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
19930 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
19940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19950 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e   Set Pager.journ
19960 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20  alHdr to -1 for 
19970 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74  the benefit of t
19980 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
19990 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  k() .    ** call
199a0 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61   which may be ma
199b0 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  de from within p
199c0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
199d0 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20  lback(). If it. 
199e0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c     ** is not -1,
199f0 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63   then the unsync
19a00 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e  ed portion of an
19a10 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
19a20 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65  le may.    ** be
19a30 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
19a40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
19a50 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
19a60 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  re occurs while.
19a70 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
19a80 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
19a90 74 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d  tabase may becom
19aa0 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
19ab0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  /.    pPager->jo
19ac0 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20  urnalHdr = -1;. 
19ad0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
19ae0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
19af0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19b00 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
19b10 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
19b20 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
19b30 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
19b40 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
19b50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
19b60 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
19b70 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
19b80 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
19b90 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
19ba0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
19bb0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
19bc0 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
19bd0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
19be0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
19bf0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
19c00 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
19c10 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
19c20 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
19c30 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
19c40 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
19c50 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
19c60 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
19c70 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
19c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19c90 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
19ca0 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
19cb0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
19cc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19cd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
19ce0 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
19cf0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
19d00 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
19d10 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
19d20 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
19d30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
19d40 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
19d50 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
19d60 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
19d70 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
19d80 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
19d90 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
19da0 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
19db0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
19dc0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
19dd0 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
19de0 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
19df0 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
19e00 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
19e10 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
19e20 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
19e30 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
19e40 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
19e50 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
19e60 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
19e70 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
19e80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
19e90 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
19ea0 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
19eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
19ec0 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f  is a.** no-op. O
19ed0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
19ee0 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
19ef0 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
19f00 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64  rnal-mode.** and
19f10 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
19f20 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
19f30 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  he the file-syst
19f40 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
19f50 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
19f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
19f70 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
19f80 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
19f90 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
19fa0 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
19fb0 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
19fc0 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
19fd0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
19fe0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
19ff0 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
1a000 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
1a010 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
1a020 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
1a030 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
1a040 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
1a050 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1a060 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
1a070 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
1a080 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
1a090 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
1a0a0 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
1a0b0 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
1a0c0 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
1a0d0 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
1a0e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a0f0 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
1a100 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
1a110 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
1a120 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
1a130 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
1a140 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
1a150 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
1a160 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
1a170 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
1a180 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
1a190 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
1a1a0 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
1a1b0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
1a1c0 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
1a1d0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
1a1e0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
1a1f0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
1a200 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
1a210 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
1a220 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
1a230 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
1a240 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
1a250 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
1a260 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
1a270 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68  .**   }.**.** Th
1a280 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1a290 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62   flag is never b
1a2a0 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72  e set for tempor
1a2b0 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e  ary files, or an
1a2c0 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74  y.** file operat
1a2d0 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1a2e0 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e  ode (Pager.noSyn
1a2f0 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72  c set to non-zer
1a300 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  o)..**.** If suc
1a310 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
1a320 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
1a330 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1a340 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
1a350 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
1a360 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
1a370 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1a380 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
1a390 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
1a3a0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1a3b0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1a3c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1a3d0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1a3e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1a3f0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
1a400 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
1a410 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1a420 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
1a430 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1a440 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  le );.    if( pP
1a450 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1a460 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
1a470 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
1a480 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20       int rc;    
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1a4b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
1a4c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
1a4d0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
1a4e0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1a4f0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a500 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
1a510 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1a520 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
1a530 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
1a540 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
1a550 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
1a560 72 69 61 62 6c 65 20 69 4e 52 65 63 4f 66 66 73  riable iNRecOffs
1a570 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1a580 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
1a590 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
1a5a0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 52      ** of the nR
1a5b0 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
1a5c0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
1a5d0 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
1a5e0 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ader..        **
1a5f0 20 54 68 69 73 20 66 69 65 6c 64 20 77 69 6c 6c   This field will
1a600 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 6c 6c   be updated foll
1a610 6f 77 69 6e 67 20 74 68 65 20 78 53 79 6e 63 28  owing the xSync(
1a620 29 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20 20 20  ) operation.    
1a630 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f      ** on the jo
1a640 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
1a650 20 20 20 20 20 20 20 69 36 34 20 69 4e 52 65 63         i64 iNRec
1a660 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
1a670 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
1a680 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1a690 69 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ic);..        /*
1a6a0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
1a6b0 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
1a6c0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
1a6d0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
1a6e0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
1a6f0 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
1a700 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
1a710 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
1a720 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
1a730 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
1a740 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1a750 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
1a760 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
1a770 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
1a780 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
1a790 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
1a7a0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
1a7b0 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
1a7c0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1a7d0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
1a7e0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
1a7f0 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
1a800 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
1a810 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
1a820 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63  nections transac
1a830 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
1a840 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
1a850 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
1a860 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
1a870 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
1a880 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
1a890 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
1a8a0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
1a8b0 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
1a8c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
1a8d0 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
1a8e0 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
1a8f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
1a900 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
1a910 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
1a920 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
1a930 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
1a940 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1a950 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
1a960 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
1a970 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
1a980 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
1a990 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
1a9a0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
1a9b0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
1a9c0 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
1a9d0 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
1a9e0 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
1a9f0 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
1aa00 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
1aa10 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
1aa20 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
1aa30 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
1aa40 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
1aa50 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
1aa60 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
1aa70 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
1aa80 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
1aa90 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
1aaa0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
1aab0 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
1aac0 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
1aad0 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
1aae0 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
1aaf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1ab00 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
1ab10 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
1ab20 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
1ab30 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
1ab40 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
1ab50 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
1ab60 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
1ab70 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
1ab80 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
1ab90 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
1aba0 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
1abb0 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
1abc0 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
1abd0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
1abe0 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
1abf0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
1ac00 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
1ac10 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1ac20 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1ac30 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1ac40 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b     u8 aMagic[8];
1ac50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ac60 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1ac70 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
1ac80 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
1ac90 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
1aca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1acb0 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
1acc0 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
1acd0 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
1ace0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1acf0 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
1ad00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ad10 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1ad20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
1ad30 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
1ad40 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
1ad50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1ad60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1ad70 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1ad80 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1ad90 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1ada0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1adb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
1adc0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1add0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1ade0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
1adf0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
1ae00 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
1ae10 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
1ae20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
1ae30 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
1ae40 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
1ae50 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
1ae60 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
1ae70 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
1ae80 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
1ae90 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
1aea0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
1aeb0 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
1aec0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
1aed0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1aee0 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
1aef0 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
1af00 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
1af10 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
1af20 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
1af30 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
1af40 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1af50 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
1af60 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
1af70 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
1af80 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
1af90 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
1afa0 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
1afb0 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
1afc0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
1afd0 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
1afe0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
1aff0 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
1b000 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
1b010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1b020 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
1b030 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
1b040 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1b050 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
1b060 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1b070 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1b080 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1b090 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1b0a0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1b0b0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1b0c0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
1b0d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1b0e0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1b0f0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1b100 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
1b110 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b120 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1b130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b140 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
1b150 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
1b160 50 61 67 65 72 2c 20 69 4e 52 65 63 4f 66 66 73  Pager, iNRecOffs
1b170 65 74 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20  et, 4));.       
1b180 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
1b190 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
1b1a0 4e 52 65 63 4f 66 66 73 65 74 2c 20 70 50 61 67  NRecOffset, pPag
1b1b0 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
1b1c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b1d0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b1e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b1f0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
1b200 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1b210 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
1b220 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1b230 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1b240 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b250 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
1b260 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
1b270 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1b280 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b290 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1b2a0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
1b2b0 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
1b2c0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
1b2d0 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
1b2e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
1b2f0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
1b300 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
1b310 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b320 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1b330 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1b340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1b350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
1b360 20 6a 75 73 74 20 73 75 63 63 65 73 73 66 75 6c   just successful
1b370 6c 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50  ly synced. Set P
1b380 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20  ager.needSync . 
1b390 20 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e     ** to zero an
1b3a0 64 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  d clear the PGHD
1b3b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
1b3c0 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a   on all pagess..
1b3d0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
1b3e0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
1b3f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
1b400 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
1b410 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
1b420 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
1b430 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b440 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1b450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b460 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
1b470 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
1b480 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
1b490 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
1b4a0 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
1b4b0 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
1b4c0 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
1b4d0 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
1b4e0 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
1b4f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
1b500 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
1b510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b520 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
1b530 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
1b540 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
1b550 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
1b560 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
1b570 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
1b580 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
1b590 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
1b5a0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
1b5b0 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
1b5c0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
1b5d0 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
1b5e0 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
1b5f0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1b600 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
1b610 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
1b620 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
1b630 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
1b640 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
1b650 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
1b660 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1b670 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
1b680 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1b690 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1b6a0 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
1b6b0 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
1b6c0 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
1b6d0 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
1b6e0 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
1b6f0 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
1b700 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
1b710 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
1b720 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
1b730 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
1b740 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
1b750 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
1b760 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
1b770 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
1b780 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
1b790 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
1b7a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b7b0 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
1b7c0 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
1b7d0 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
1b7e0 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
1b7f0 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
1b800 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
1b810 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
1b820 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
1b830 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
1b840 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
1b850 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
1b860 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
1b870 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
1b880 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
1b890 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
1b8a0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
1b8b0 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
1b8c0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
1b8d0 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
1b8e0 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
1b8f0 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
1b900 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
1b910 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
1b920 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1b930 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
1b940 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
1b950 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
1b960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b970 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
1b980 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
1b990 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
1b9a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1b9b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
1b9c0 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
1b9d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1b9e0 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
1b9f0 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
1ba00 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
1ba10 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
1ba20 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
1ba30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1ba40 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1ba50 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
1ba60 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1ba70 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1ba80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1ba90 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1baa0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1bad0 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 69  de */..  if( pLi
1bae0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  st==0 ) return S
1baf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
1bb00 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
1bb10 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
1bb20 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
1bb30 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
1bb40 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
1bb50 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
1bb60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1bb70 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
1bb80 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
1bb90 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
1bba0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
1bbb0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
1bbc0 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
1bbd0 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
1bbe0 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
1bbf0 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
1bc00 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
1bc10 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
1bc20 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
1bc30 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
1bc40 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
1bc50 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
1bc60 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
1bc70 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1bc80 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
1bc90 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
1bca0 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
1bcb0 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
1bcc0 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
1bcd0 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
1bce0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
1bcf0 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
1bd00 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
1bd10 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
1bd20 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
1bd30 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
1bd40 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
1bd50 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
1bd60 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
1bd70 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
1bd80 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
1bd90 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
1bda0 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
1bdb0 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
1bdc0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
1bdd0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1bde0 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
1bdf0 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
1be00 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
1be10 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1be20 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
1be30 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
1be40 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
1be50 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
1be60 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
1be70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1be80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1be90 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1bea0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1beb0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1bec0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1bed0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
1bee0 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
1bef0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
1bf00 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
1bf10 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
1bf20 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1bf30 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
1bf40 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1bf50 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
1bf60 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
1bf70 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
1bf80 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
1bf90 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
1bfa0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
1bfb0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1bfc0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
1bfd0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1bfe0 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
1bff0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
1c000 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
1c010 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
1c020 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
1c030 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  gs);.  }..  whil
1c040 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1c050 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
1c060 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
1c070 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
1c080 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
1c090 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
1c0a0 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
1c0b0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1c0c0 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
1c0d0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
1c0e0 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
1c0f0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1c100 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
1c110 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
1c120 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
1c130 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
1c140 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
1c150 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
1c160 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
1c170 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
1c180 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1c190 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
1c1a0 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
1c1b0 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
1c1c0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1c1d0 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
1c1e0 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
1c1f0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
1c200 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1c210 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
1c220 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
1c230 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
1c240 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
1c250 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
1c260 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1c270 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1c280 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  e;         /* Of
1c290 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
1c2a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
1c2b0 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  ta = CODEC2(pPag
1c2c0 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
1c2d0 2c 20 70 67 6e 6f 2c 20 36 29 3b 20 2f 2a 20 44  , pgno, 6); /* D
1c2e0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  ata to write */.
1c2f0 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
1c300 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
1c310 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
1c320 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1c330 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
1c340 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
1c350 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
1c360 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
1c370 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
1c380 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
1c390 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
1c3a0 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
1c3b0 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
1c3c0 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
1c3d0 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
1c3e0 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
1c3f0 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
1c400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c410 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
1c420 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
1c430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1c440 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1c450 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1c460 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1c470 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
1c480 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1c490 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
1c4a0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
1c4b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
1c4c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
1c4d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1c4e0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
1c4f0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
1c500 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
1c510 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
1c520 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
1c530 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
1c540 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1c550 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1c560 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
1c570 20 2a 29 70 44 61 74 61 29 3b 0a 0a 20 20 20 20   *)pData);..    
1c580 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1c590 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1c5a0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5c0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c5d0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1c5e0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1c5f0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1c600 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1c610 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1c620 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1c630 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1c640 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1c650 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1c660 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1c670 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c680 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1c690 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1c6a0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1c6b0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1c6c0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1c6d0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1c6e0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1c6f0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1c700 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1c710 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1c720 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1c730 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1c740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1c750 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1c760 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1c770 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1c780 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1c790 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1c7a0 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1c7b0 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1c7c0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1c7d0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1c7e0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1c7f0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1c800 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1c810 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1c820 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1c830 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1c840 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1c850 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1c860 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1c870 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1c880 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1c890 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c8a0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1c8b0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1c8c0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1c8d0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1c8e0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1c8f0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1c900 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1c910 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1c920 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1c930 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1c940 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1c950 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1c960 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1c970 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1c980 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1c990 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1c9a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1c9b0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c9c0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1c9d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1c9e0 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1c9f0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1ca00 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1ca10 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1ca20 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1ca30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1ca40 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43  char *pData2 = C
1ca50 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1ca60 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1ca70 37 29 3b 0a 20 20 0a 20 20 20 20 50 41 47 45 52  7);.  .    PAGER
1ca80 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
1ca90 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1caa0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1cab0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
1cac0 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28  ;.  .    assert(
1cad0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
1cae0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
1caf0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
1cb00 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ize );.    rc = 
1cb10 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
1cb20 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
1cb30 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1cb40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cb50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1cb60 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1cb70 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
1cb80 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1cb90 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
1cba0 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  4);.    }.  }.  
1cbb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cbc0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
1cbd0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
1cbe0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cbf0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
1cc00 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
1cc10 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
1cc20 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1cc30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cc40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cc50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cc60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1cc70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1cc80 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
1cc90 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
1cca0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
1ccb0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
1ccc0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
1ccd0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1cce0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
1ccf0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
1cd00 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
1cd10 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
1cd20 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
1cd30 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
1cd40 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
1cd50 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
1cd60 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
1cd70 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
1cd80 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
1cd90 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
1cda0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1cdb0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
1cdc0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
1cdd0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1cde0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
1cdf0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
1ce00 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
1ce10 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
1ce20 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
1ce30 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
1ce40 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
1ce50 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
1ce60 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
1ce70 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
1ce80 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
1ce90 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
1cea0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
1ceb0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
1cec0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
1ced0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1cee0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
1cef0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
1cf00 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
1cf10 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1cf20 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1cf30 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
1cf40 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
1cf50 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
1cf60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1cf70 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
1cf80 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
1cf90 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
1cfa0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
1cfb0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1cfc0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
1cfd0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
1cfe0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
1cff0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
1d000 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
1d010 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1d020 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
1d030 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
1d040 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d050 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
1d060 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d070 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
1d080 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
1d090 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1d0a0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d0b0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
1d0c0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
1d0d0 67 20 69 73 20 73 65 74 20 62 79 20 74 68 65 20  g is set by the 
1d0e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d0f0 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  e() function whi
1d100 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f  le it.  ** is jo
1d110 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20  urnalling a set 
1d120 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64  of two or more d
1d130 61 74 61 62 61 73 65 20 70 61 67 65 73 20 74 68  atabase pages th
1d140 61 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  at are stored.  
1d150 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64  ** on the same d
1d160 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63  isk sector. Sync
1d170 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
1d180 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77  is not allowed w
1d190 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69  hile.  ** this i
1d1a0 73 20 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69  s happening as i
1d1b0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
1d1c0 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  hat all members 
1d1d0 6f 66 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  of such a.  ** s
1d1e0 65 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20  et of pages are 
1d1f0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74  synced to disk t
1d200 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20  ogether. So, if 
1d210 74 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75  the page this fu
1d220 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74  nction.  ** is t
1d230 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c  rying to make cl
1d240 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65  ean will require
1d250 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20   a journal sync 
1d260 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  and the doNotSyn
1d270 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73  c.  ** flag is s
1d280 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  et, return witho
1d290 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
1d2a0 67 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c 61  g. The pcache la
1d2b0 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75  yer will.  ** ju
1d2c0 73 74 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68  st have to go ah
1d2d0 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ead and allocate
1d2e0 20 61 20 6e 65 77 20 70 61 67 65 20 62 75 66 66   a new page buff
1d2f0 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  er instead of.  
1d300 2a 2a 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a  ** reusing pPg..
1d310 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61    **.  ** Simila
1d320 72 6c 79 2c 20 69 66 20 74 68 65 20 70 61 67 65  rly, if the page
1d330 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
1d340 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
1d350 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20  state, do not.  
1d360 2a 2a 20 74 72 79 20 74 6f 20 77 72 69 74 65 20  ** try to write 
1d370 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d380 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a  pPg to disk..  *
1d390 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1d3a0 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
1d3b0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26  er->doNotSync &&
1d3c0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d3d0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a  R_NEED_SYNC) ){.
1d3e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d3f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
1d400 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
1d410 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
1d420 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  d. */.  if( pPg-
1d430 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1d440 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63  D_SYNC ){.    rc
1d450 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
1d460 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1d470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d480 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1d490 63 20 26 26 20 0a 20 20 20 20 20 20 21 28 70 50  c && .      !(pP
1d4a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1d4b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
1d4c0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a  MODE_MEMORY) &&.
1d4d0 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f        !(sqlite3O
1d4e0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1d4f0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1d500 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
1d510 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20  SAFE_APPEND).   
1d520 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1d530 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
1d540 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1d550 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1d560 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1d570 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
1d580 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
1d590 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
1d5a0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1d5b0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  of.  ** the data
1d5c0 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d  base image, it m
1d5d0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72  ay need to be wr
1d5e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
1d5f0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54  -journal..  ** T
1d600 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
1d610 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  he call to pager
1d620 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1d630 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  ) below will not
1d640 0a 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77  .  ** actually w
1d650 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
1d660 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
1d670 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  se..  **.  ** Co
1d680 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1d690 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  wing sequence of
1d6a0 20 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20   events:.  **.  
1d6b0 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a  **   BEGIN;.  **
1d6c0 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
1d6d0 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c  ge X>.  **     <
1d6e0 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20  modify page X>. 
1d6f0 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
1d700 54 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20  T sp;.  **      
1d710 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
1d720 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
1d730 73 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61  s>.  **       pa
1d740 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58  gerStress(page X
1d750 29 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42  ).  **     ROLLB
1d760 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a  ACK TO sp;.  **.
1d770 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
1d780 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
1d790 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
1d7a0 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
1d7b0 65 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f  e written.  ** o
1d7c0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
1d7d0 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
1d7e0 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
1d7f0 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
1d800 6e 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  n,.  ** followin
1d810 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  g the "ROLLBACK 
1d820 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74  TO sp" statement
1d830 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58  , reading page X
1d840 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20   will read.  ** 
1d850 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
1d860 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
1d870 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  s will be the co
1d880 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20  py of page X as 
1d890 69 74 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  it.  ** was when
1d8a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d8b0 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
1d8c0 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
1d8d0 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a  VEPOINT sp".  **
1d8e0 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20   was executed.. 
1d8f0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c   **.  ** The sol
1d900 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74  ution is to writ
1d910 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  e the current da
1d920 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e  ta for page X in
1d930 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62  to the .  ** sub
1d940 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
1d950 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
1d960 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
1d970 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
1d980 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
1d990 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
1d9a0 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
1d9b0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
1d9c0 69 73 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65  is .  ** execute
1d9d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1d9e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d9f0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1da00 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52  >dbSize && subjR
1da10 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
1da20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62   ){.    rc = sub
1da30 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
1da40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1da50 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1da60 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
1da70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1da80 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ile. */.  if( rc
1da90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1daa0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
1dab0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
1dac0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1dad0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
1dae0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
1daf0 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
1db00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db10 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
1db20 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
1db30 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1db40 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1db50 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
1db60 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1db70 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
1db80 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1db90 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1dba0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
1dbb0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
1dbc0 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
1dbd0 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
1dbe0 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
1dbf0 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
1dc00 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
1dc10 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
1dc20 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
1dc30 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1dc40 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
1dc50 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1dc60 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1dc70 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
1dc80 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
1dc90 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
1dca0 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
1dcb0 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
1dcc0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1dcd0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
1dce0 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
1dcf0 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
1dd00 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
1dd10 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
1dd20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1dd30 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
1dd40 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
1dd50 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
1dd60 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
1dd70 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
1dd80 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
1dd90 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
1dda0 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
1ddb0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
1ddc0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
1ddd0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1dde0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
1ddf0 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
1de00 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
1de10 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
1de20 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
1de30 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
1de40 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
1de50 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
1de60 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
1de70 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
1de80 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1de90 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
1dea0 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
1deb0 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
1dec0 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
1ded0 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
1dee0 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
1def0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
1df00 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
1df10 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
1df20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
1df30 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
1df40 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
1df50 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
1df60 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
1df70 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
1df80 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
1df90 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
1dfa0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
1dfb0 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
1dfc0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
1dfd0 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
1dfe0 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
1dff0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1e000 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
1e010 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
1e020 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
1e030 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
1e040 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
1e050 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
1e060 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
1e070 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
1e080 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
1e090 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
1e0a0 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
1e0b0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1e0c0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
1e0d0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
1e0e0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
1e0f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e100 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
1e110 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
1e120 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
1e130 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
1e140 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
1e150 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
1e160 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
1e170 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
1e180 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1e190 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
1e1a0 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
1e1b0 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
1e1c0 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
1e1d0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
1e1e0 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
1e1f0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
1e200 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1e210 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1e220 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1e230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1e240 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1e250 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
1e260 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
1e270 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
1e280 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
1e290 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1e2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e2b0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
1e2c0 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
1e2d0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e2f0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
1e300 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
1e310 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
1e320 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
1e330 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e340 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
1e350 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
1e360 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
1e370 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1e380 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
1e390 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e3a0 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
1e3b0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e3c0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
1e3d0 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
1e3e0 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
1e3f0 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
1e400 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e410 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
1e420 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1e430 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
1e440 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e450 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1e460 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
1e470 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
1e480 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
1e490 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
1e4a0 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
1e4b0 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
1e4c0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
1e4d0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
1e4e0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
1e4f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
1e500 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
1e510 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1e520 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
1e530 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
1e540 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
1e550 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
1e560 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
1e570 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
1e580 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
1e590 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
1e5a0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
1e5b0 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
1e5c0 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
1e5d0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
1e5e0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
1e5f0 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
1e600 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e610 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
1e620 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67  e */.  u16 szPag
1e630 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
1e640 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1e650 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
1e660 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
1e670 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1e680 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
1e690 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
1e6a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
1e6b0 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
1e6c0 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
1e6d0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1e6e0 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
1e6f0 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
1e700 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
1e710 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
1e720 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
1e730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1e740 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
1e750 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
1e760 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
1e770 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
1e780 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
1e790 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
1e7a0 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
1e7b0 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
1e7c0 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
1e7d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
1e7e0 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
1e7f0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
1e800 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1e810 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
1e820 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
1e830 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
1e840 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1e850 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
1e860 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
1e870 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
1e880 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1e890 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
1e8a0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
1e8b0 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
1e8c0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1e8d0 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
1e8e0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
1e8f0 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
1e900 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
1e910 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
1e920 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
1e930 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
1e940 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
1e950 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
1e960 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
1e970 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
1e980 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
1e990 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
1e9a0 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
1e9b0 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
1e9c0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
1e9d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
1e9e0 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
1e9f0 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
1ea00 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
1ea10 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1ea20 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1ea30 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
1ea40 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
1ea50 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
1ea60 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
1ea70 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
1ea80 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
1ea90 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
1eaa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1eab0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1eac0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ead0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
1eae0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
1eaf0 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
1eb00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
1eb10 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
1eb20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
1eb30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
1eb40 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
1eb50 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
1eb60 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
1eb70 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
1eb80 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
1eb90 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
1eba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
1ebb0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
1ebc0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
1ebd0 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
1ebe0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50  );.    }..    nP
1ebf0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1ec00 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
1ec10 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1ec20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
1ec30 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
1ec40 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
1ec50 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
1ec60 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
1ec70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
1ec80 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
1ec90 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
1eca0 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
1ecb0 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
1ecc0 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
1ecd0 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
1ece0 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
1ecf0 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
1ed00 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
1ed10 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
1ed20 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
1ed30 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
1ed40 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1ed50 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
1ed60 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
1ed70 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
1ed80 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
1ed90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1eda0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
1edb0 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EN;.    }.    if
1edc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1edd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ede0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1edf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1ee00 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
1ee10 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
1ee20 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
1ee30 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
1ee40 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
1ee50 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
1ee60 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
1ee70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
1ee80 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
1ee90 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
1eea0 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
1eeb0 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
1eec0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
1eed0 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
1eee0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1eef0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
1ef00 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
1ef10 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
1ef20 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1ef30 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
1ef40 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
1ef50 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1ef60 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
1ef70 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
1ef80 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
1ef90 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
1efa0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1efb0 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
1efc0 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
1efd0 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
1efe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1eff0 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
1f000 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
1f010 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
1f020 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
1f030 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
1f040 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
1f050 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
1f060 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
1f070 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
1f080 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
1f090 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
1f0a0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
1f0b0 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
1f0c0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1f0d0 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
1f0e0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
1f0f0 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
1f100 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
1f110 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
1f120 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
1f130 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
1f140 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
1f150 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
1f160 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
1f170 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
1f180 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
1f190 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
1f1a0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
1f1b0 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
1f1c0 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1f1d0 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
1f1e0 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20   + 8 + 1        
1f1f0 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
1f200 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65  l */.  );.  asse
1f210 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1f220 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
1f230 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
1f240 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
1f250 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
1f260 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f270 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1f280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1f290 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
1f2a0 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
1f2b0 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
1f2c0 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
1f2d0 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
1f2e0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f2f0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1f300 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
1f310 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
1f320 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
1f330 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
1f340 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
1f350 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
1f360 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f370 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
1f380 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
1f390 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
1f3a0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
1f3b0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
1f3c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f3d0 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
1f3e0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
1f3f0 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
1f400 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1f410 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
1f420 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
1f430 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
1f440 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
1f450 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
1f460 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
1f470 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
1f480 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50  thname ){.    pP
1f490 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
1f4a0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
1f4b0 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
1f4c0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
1f4d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1f4e0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1f4f0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1f500 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
1f510 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
1f520 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
1f530 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1f540 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
1f550 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
1f560 20 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   8);.    sqlite3
1f570 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1f580 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1f590 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
1f5a0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
1f5b0 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
1f5c0 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
1f5d0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
1f5e0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
1f5f0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
1f600 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
1f610 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f630 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
1f640 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
1f650 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1f660 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
1f670 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f680 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
1f690 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
1f6a0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
1f6b0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
1f6c0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
1f6d0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1f6e0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1f6f0 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
1f700 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
1f710 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
1f720 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1f730 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
1f740 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
1f750 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1f760 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
1f770 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
1f780 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
1f790 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
1f7a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1f7b0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
1f7c0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
1f7d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1f7e0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1f7f0 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
1f800 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
1f810 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
1f820 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
1f830 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
1f840 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f850 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
1f860 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
1f870 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1f880 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1f890 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
1f8a0 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
1f8b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f8c0 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
1f8d0 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
1f8e0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
1f8f0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1f900 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
1f910 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f920 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
1f930 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1f940 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
1f950 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f960 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
1f970 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
1f980 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70  ageDflt = (u16)p
1f990 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1f9a0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1f9b0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1f9c0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1f9d0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
1f9e0 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
1f9f0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1fa00 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1fa10 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1fa20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1fa30 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1fa40 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1fa50 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
1fa60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
1fa70 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fa80 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
1fa90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1faa0 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
1fab0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
1fac0 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
1fad0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
1fae0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
1faf0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1fb00 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
1fb10 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
1fb20 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
1fb30 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
1fb40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
1fb50 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
1fb60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fb70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
1fb80 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
1fb90 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
1fba0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1fbb0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
1fbc0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
1fbd0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
1fbe0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
1fbf0 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
1fc00 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
1fc10 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
1fc20 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
1fc30 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
1fc40 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
1fc50 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
1fc60 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
1fc70 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
1fc80 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
1fc90 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
1fca0 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
1fcb0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
1fcc0 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
1fcd0 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
1fce0 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
1fcf0 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
1fd00 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
1fd10 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
1fd20 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
1fd30 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
1fd40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1fd50 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
1fd60 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  IVE;.  }..  /* T
1fd70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
1fd80 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
1fd90 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
1fda0 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
1fdb0 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
1fdc0 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
1fdd0 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
1fde0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
1fdf0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
1fe00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fe10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1fe20 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
1fe30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fe40 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1fe50 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
1fe60 44 66 6c 74 29 3b 0a 20 20 20 20 74 65 73 74 63  Dflt);.    testc
1fe70 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1fe80 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
1fe90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1fea0 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  rred in either o
1feb0 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
1fec0 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20  ve, free the .  
1fed0 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  ** Pager structu
1fee0 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
1fef0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
1ff00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ff10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
1ff20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1ff30 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
1ff40 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1ff50 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
1ff60 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
1ff70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ff80 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
1ff90 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
1ffa0 6a 65 63 74 2e 20 2a 2f 0a 20 20 6e 45 78 74 72  ject. */.  nExtr
1ffb0 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
1ffc0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  a);.  sqlite3Pca
1ffd0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
1ffe0 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
1fff0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
20000 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
20010 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
20020 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
20030 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20040 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
20050 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
20060 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
20070 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
20080 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
20090 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
200a0 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
200b0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
200c0 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
200d0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
200e0 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
200f0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
20100 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
20110 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
20120 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
20130 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
20140 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20150 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
20160 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
20170 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
20180 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
20190 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f  = (u8)memDb;.  /
201a0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
201b0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
201c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
201d0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
201e0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
201f0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
20200 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
20210 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
20220 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
20230 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
20240 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ; */.  assert( p
20250 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
20260 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
20270 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
20280 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20  GER_UNLOCK) );. 
20290 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
202a0 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
202b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
202c0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
202d0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
202e0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
202f0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
20300 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
20310 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
20320 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
20330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
20340 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
20350 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
20360 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
20370 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
20380 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
20390 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
203a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
203b0 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
203c0 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
203d0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
203e0 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
203f0 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
20400 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
20410 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
20420 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
20430 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
20440 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20  Journal) ?1:0;. 
20450 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
20460 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  c = pPager->noSy
20470 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65  nc ?0:1;.  pPage
20480 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
20490 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
204a0 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
204b0 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
204c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
204d0 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
204e0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
204f0 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
20500 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
20510 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
20520 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
20530 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
20540 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
20550 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
20560 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20570 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
20580 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
20590 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
205a0 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
205b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
205c0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
205d0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
205e0 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
205f0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
20600 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20610 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
20620 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  rg = 0; */.  /* 
20630 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
20640 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
20650 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
20660 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
20670 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
20680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20690 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
206a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
206b0 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
206c0 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
206d0 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
206e0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
206f0 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
20700 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
20710 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
20720 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
20730 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
20740 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
20750 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
20760 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
20770 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
20780 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
20790 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
207a0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
207b0 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
207c0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
207d0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
207e0 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
207f0 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
20800 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
20810 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
20820 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
20830 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
20840 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20850 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
20860 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
20870 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
20880 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
20890 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
208a0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
208b0 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
208c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
208d0 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
208e0 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
208f0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
20900 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20910 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
20920 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
20930 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
20940 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
20950 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
20960 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
20970 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
20980 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
20990 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
209a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
209b0 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
209c0 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
209d0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
209e0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
209f0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
20a00 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
20a10 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
20a20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
20a30 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
20a40 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
20a50 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
20a60 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
20a70 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
20a80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20a90 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
20aa0 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
20ab0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
20ac0 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
20ad0 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
20ae0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
20af0 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
20b00 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
20b10 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
20b20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
20b30 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
20b40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
20b50 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
20b60 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
20b70 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
20b80 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
20b90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
20ba0 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
20bb0 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
20bc0 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
20bd0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
20be0 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
20bf0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
20c00 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
20c10 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
20c20 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
20c30 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
20c40 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
20c50 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
20c60 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
20c70 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
20c80 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
20c90 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
20ca0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
20cb0 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
20cc0 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
20cd0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
20ce0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
20cf0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
20d00 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
20d10 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
20d20 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
20d30 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
20d40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
20d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20d60 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
20d70 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20 20 20  int exists;     
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20d90 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
20da0 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
20db0 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
20dc0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
20dd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20de0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
20df0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
20e00 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
20e10 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
20e20 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
20e30 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
20e40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20e50 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
20e60 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20e70 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
20e80 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
20e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20ea0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
20eb0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
20ee0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
20ef0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
20f00 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
20f10 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
20f20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
20f30 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
20f40 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
20f50 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
20f60 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
20f70 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
20f80 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
20f90 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
20fa0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
20fb0 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
20fc0 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
20fd0 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
20fe0 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
20ff0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
21000 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
21010 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
21020 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
21030 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
21040 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
21050 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
21060 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
21070 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
21080 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
21090 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
210a0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
210b0 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
210c0 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
210d0 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
210e0 63 6b 20 72 6f 75 74 69 6e 65 20 75 6e 64 65 72  ck routine under
210f0 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
21100 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
21110 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
21120 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
21130 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
21140 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21150 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
21160 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
21170 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  nPage;..      /*
21180 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20   Check the size 
21190 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
211a0 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73  file. If it cons
211b0 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c  ists of 0 pages,
211c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64  .      ** then d
211d0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
211e0 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20  l file. See the 
211f0 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61  header comment a
21200 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20  bove for .      
21210 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67  ** the reasoning
21220 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74   here.  Delete t
21230 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  he obsolete jour
21240 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20  nal file under. 
21250 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56       ** a RESERV
21260 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64  ED lock to avoid
21270 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
21280 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
21290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
212a0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
212b0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
212c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
212d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
212e0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
212f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21300 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
21310 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
21320 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
21330 75 73 69 76 65 4d 6f 64 65 0a 20 20 20 20 20 20  usiveMode.      
21340 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 20 73             ||  s
21350 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
21360 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
21370 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
21380 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21390 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
213a0 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
213b0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
213c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
213d0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
213e0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
213f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
21400 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
21410 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
21420 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21440 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
21450 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
21460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
21480 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
21490 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
214a0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
214b0 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
214c0 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
214d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
214e0 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
214f0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
21500 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
21510 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
21520 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
21530 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
21540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
21550 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
21560 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
21570 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
21580 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
21590 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
215a0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
215b0 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
215c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
215d0 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
215e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
215f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
21600 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
21610 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
21620 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
21630 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
21640 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
21650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21660 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21670 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
21680 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
21690 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
216a0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
216b0 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29  r->jfd, (void *)
216c0 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20  &first, 1, 0);. 
216d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
216e0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
216f0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
21700 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
21710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21730 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
21740 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
21750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  );.            *
21760 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
21770 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
21780 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
21790 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
217a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
217b0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
217c0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
217d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
217e0 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
217f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
21800 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  s has a zero hea
21810 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
21820 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
21830 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
21840 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
21850 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
21860 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
21870 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
21880 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
21890 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
218a0 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
218b0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
218c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
218d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
218e0 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
218f0 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
21900 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
21910 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
21920 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
21930 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
21940 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
21950 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
21960 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
21970 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
21980 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
21990 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
219a0 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
219b0 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
219c0 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
219d0 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
219e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
219f0 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
21a00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
21a10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21a20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21a40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
21a50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21a60 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
21a70 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
21a80 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
21a90 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f  se file and into
21aa0 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
21ab0 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
21ac0 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
21ad0 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
21ae0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
21af0 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
21b00 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
21b10 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
21b20 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
21b30 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
21b40 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
21b50 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
21b60 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
21b70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21b80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
21b90 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
21ba0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
21bb0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
21bc0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
21bd0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
21be0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
21bf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
21c00 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
21c10 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
21c20 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
21c30 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
21c40 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
21c50 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
21c60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
21c70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
21c80 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
21c90 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
21ca0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
21cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
21cc0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 36 34  rn code */.  i64
21cd0 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20   iOffset;       
21ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
21cf0 65 20 6f 66 66 73 65 74 20 6f 66 20 66 69 6c 65  e offset of file
21d00 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
21d10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
21d20 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
21d30 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44  _SHARED && !MEMD
21d40 42 20 29 3b 0a 0a 20 20 69 66 28 20 21 69 73 4f  B );..  if( !isO
21d50 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
21d60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
21d70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
21d80 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
21d90 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
21da0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
21db0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21dc0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66  E_OK;.  }.  iOff
21dd0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
21de0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
21df0 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
21e00 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
21e10 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
21e20 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
21e30 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  ize, iOffset);. 
21e40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21e50 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
21e60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
21e70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
21e80 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
21e90 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
21ea0 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
21eb0 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65  ata)[24];.    me
21ec0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
21ed0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
21ee0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61  Vers, sizeof(pPa
21ef0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
21f00 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
21f10 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
21f20 74 61 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 0a 20  ta, pgno, 3);.. 
21f30 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
21f40 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
21f50 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
21f60 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
21f70 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
21f80 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
21f90 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
21fa0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
21fb0 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
21fc0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
21fe0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
21ff0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
22000 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
22010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22020 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22030 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
22040 65 76 65 72 20 74 68 65 20 75 70 70 65 72 20 6c  ever the upper l
22050 61 79 65 72 20 72 65 71 75 65 73 74 73 20 61 20  ayer requests a 
22060 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65  database.** page
22070 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 62   is requested, b
22080 65 66 6f 72 65 20 74 68 65 20 63 61 63 68 65 20  efore the cache 
22090 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
220a0 20 73 75 69 74 61 62 6c 65 20 70 61 67 65 0a 2a   suitable page.*
220b0 2a 20 6f 72 20 61 6e 79 20 64 61 74 61 20 69 73  * or any data is
220c0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
220d0 61 74 61 62 61 73 65 2e 20 49 74 20 70 65 72 66  atabase. It perf
220e0 6f 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  orms the followi
220f0 6e 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63 74 69  ng.** two functi
22100 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ons:.**.**   1) 
22110 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
22120 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
22130 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
22140 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
22150 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
22160 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
22170 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
22180 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
22190 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      SHARED 
221a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
221b0 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64  base file. Immed
221c0 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
221d0 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
221e0 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
221f0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
22200 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
22210 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
22220 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
22230 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
22240 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
22250 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
22260 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
22270 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
22280 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
22290 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
222a0 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
222b0 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
222c0 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
222d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
222e0 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
222f0 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
22300 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
22310 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
22320 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
22330 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
22340 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
22350 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
22360 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
22370 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
22380 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
22390 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
223a0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
223b0 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
223c0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
223d0 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
223e0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
223f0 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
22400 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
22410 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
22420 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
22430 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
22440 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
22450 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
22460 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63  e operation desc
22470 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f  ribed by (2) abo
22480 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ve is not attemp
22490 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a  ted, and if the.
224a0 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  ** pager is in a
224b0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
224c0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
224d0 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69  FULL when this i
224e0 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65  s called,.** the
224f0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
22500 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
22510 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69  ned. It is permi
22520 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  tted to read the
22530 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65  .** database whe
22540 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  n in SQLITE_FULL
22550 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
22560 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
22570 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
22580 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
22590 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
225a0 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65  d. If an.** IO e
225b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
225c0 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
225d0 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
225e0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
225f0 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f  al.** file or ro
22600 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
22610 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
22620 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
22630 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
22640 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61  tic int pagerSha
22650 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
22660 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
22670 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22690 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
226a0 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65   int isErrorRese
226b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
226c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
226d0 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65  ecovering from e
226e0 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20  rror state */.. 
226f0 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
22700 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66  base is opened f
22710 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
22720 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73  ess, has no outs
22730 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61  tanding .  ** pa
22740 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  ge references an
22750 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  d is in an error
22760 2d 73 74 61 74 65 2c 20 74 68 69 73 20 69 73 20  -state, this is 
22770 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  a chance to clea
22780 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
22790 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
227a0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
227b0 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72  ger-cache and tr
227c0 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65  eat any.  ** ope
227d0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
227e0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e  s a hot-journal.
227f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d  .  */.  if( !MEM
22800 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  DB && pPager->ex
22810 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
22820 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
22830 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
22840 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20  >pPCache)==0 && 
22850 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
22860 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  .  ){.    if( is
22870 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
22880 29 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  ) ){.      isErr
22890 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
228a0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
228b0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
228c0 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
228d0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
228e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
228f0 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20  ger is still in 
22900 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  an error state, 
22910 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20  do not proceed. 
22920 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  The error .  ** 
22930 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c  state will be cl
22940 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f  eared at some po
22950 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
22960 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20  e when all page 
22970 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
22980 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64   are dropped and
22990 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62   the cache can b
229a0 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a  e discarded..  *
229b0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
229c0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
229d0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
229e0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
229f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
22a00 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  rCode;.  }..  if
22a10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
22a20 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
22a30 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
22a40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
22a50 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
22a60 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
22a70 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e    int isHotJourn
22a80 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
22a90 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
22aa0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22ab0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
22ac0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22ad0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21  ==0 );.    if( !
22ae0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
22af0 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ck ){.      rc =
22b00 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
22b10 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
22b20 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
22b30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22b40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
22b50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
22b60 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
22b70 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
22b80 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
22b90 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
22ba0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
22bb0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
22bc0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
22bd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
22be0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
22bf0 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  RED;.    }.    a
22c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
22c10 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
22c20 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
22c30 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
22c40 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
22c50 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
22c60 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
22c70 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
22c80 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
22c90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
22ca0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
22cb0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
22cc0 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65  if( !isErrorRese
22cd0 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
22ce0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
22cf0 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
22d00 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
22d10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22d20 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
22d30 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
22d40 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
22d50 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
22d60 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
22d70 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
22d80 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
22d90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22da0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
22db0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
22dc0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
22dd0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
22de0 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
22df0 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
22e00 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
22e10 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
22e20 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
22e30 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
22e40 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
22e50 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
22e60 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
22e70 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
22e80 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
22e90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
22ea0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
22eb0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
22ec0 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
22ed0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
22ee0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
22ef0 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
22f00 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
22f10 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
22f20 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
22f30 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
22f40 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
22f50 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
22f60 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
22f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
22f80 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
22f90 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
22fa0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
22fb0 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
22fc0 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
22fd0 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
22fe0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22ff0 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
23000 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
23010 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
23020 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
23030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
23040 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
23050 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
23060 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
23070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23080 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
23090 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
230a0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
230b0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
230c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
230d0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
230e0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
230f0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
23100 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
23110 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
23120 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
23130 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
23140 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
23150 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
23160 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
23170 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
23180 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  pen and.      **
23190 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
231a0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
231b0 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
231c0 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
231d0 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
231e0 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
231f0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
23200 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
23210 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
23220 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
23230 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
23240 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
23250 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
23260 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
23270 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
23280 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
23290 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
232a0 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
232b0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
232c0 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
232d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
232e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
232f0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
23300 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
23310 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23320 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
23330 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
23340 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
23350 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
23360 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
23370 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
23380 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
23390 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
233a0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
233b0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
233c0 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
233d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
233e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
233f0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
23400 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
23410 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23420 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
23430 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
23440 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
23450 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23460 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
23470 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23480 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
23490 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
234a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
234b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
234c0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
234d0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
234e0 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f  t, that means so
234f0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
23500 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23510 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c  has already roll
23520 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20  ed it back */.  
23530 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23540 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
23550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23560 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23570 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23580 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
23590 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
235a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
235b0 3a 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20  : Why are these 
235c0 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73  cleared here? Is
235d0 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a   it necessary? *
235e0 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
235f0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
23600 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
23610 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
23620 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
23630 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
23640 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
23650 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
23660 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
23670 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
23680 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
23690 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
236a0 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
236b0 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
236c0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
236d0 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
236e0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
236f0 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
23700 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
23710 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
23720 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
23730 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
23740 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  cache..      */.
23750 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
23760 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
23770 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
23780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23790 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
237a0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
237b0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
237c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
237d0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
237e0 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
237f0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  ==PAGER_SHARED).
23800 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
23810 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
23820 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
23830 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
23840 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ED).      );.   
23850 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67   }..    if( pPag
23860 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73  er->pBackup || s
23870 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
23880 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
23890 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
238a0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
238b0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
238c0 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
238d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
238e0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
238f0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
23900 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
23910 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
23920 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
23930 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
23940 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
23950 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
23960 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
23970 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
23980 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
23990 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
239a0 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
239b0 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
239c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
239d0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
239e0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
239f0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
23a00 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
23a10 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
23a20 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
23a30 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
23a40 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
23a50 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
23a60 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
23a70 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
23a80 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
23a90 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
23aa0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
23ab0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
23ac0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
23ad0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
23ae0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
23af0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
23b00 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
23b10 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
23b20 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
23b30 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
23b40 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
23b50 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
23b60 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
23b70 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
23b80 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
23b90 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
23ba0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
23bb0 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20    */.      char 
23bc0 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
23bd0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
23be0 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71  Vers)];.      sq
23bf0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
23c00 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
23c10 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
23c20 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
23c30 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65        rc = pPage
23c40 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
23c50 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
23c60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23c70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23c80 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
23c90 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
23ca0 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
23cb0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
23cc0 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
23cd0 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
23ce0 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
23cf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23d00 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
23d10 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
23d20 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
23d30 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
23d40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23d60 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
23d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23d80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
23d90 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
23da0 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
23db0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
23dc0 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
23dd0 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
23de0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
23df0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
23e00 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
23e10 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
23e20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
23e30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
23e40 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
23e50 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
23e60 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
23e70 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a  R_SHARED );.  }.
23e80 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
23e90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23ea0 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e  .    /* pager_un
23eb0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
23ec0 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  p for exclusive 
23ed0 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f  mode and in-memo
23ee0 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ry databases. */
23ef0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
23f00 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
23f10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23f20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
23f30 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
23f40 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
23f50 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
23f60 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
23f70 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
23f80 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
23f90 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
23fa0 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
23fb0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
23fc0 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
23fd0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
23fe0 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
23ff0 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
24000 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
24010 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
24020 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
24030 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
24040 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
24050 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
24060 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
24070 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
24080 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
24090 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
240a0 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70  e)==0).   && (!p
240b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
240c0 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
240d0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
240e0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
240f0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
24100 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
24110 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65  *.** Drop a page
24120 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
24130 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  using sqlite3Pca
24140 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a  cheDrop()..**.**
24150 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
24160 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20  here are now no 
24170 70 61 67 65 73 20 77 69 74 68 20 72 65 66 65 72  pages with refer
24180 65 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61  ences to them, a
24190 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
241a0 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
241b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
241c0 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a   is removed..*/.
241d0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
241e0 72 44 72 6f 70 50 61 67 65 28 44 62 50 61 67 65  rDropPage(DbPage
241f0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
24200 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
24210 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  Pager;.  sqlite3
24220 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
24230 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
24240 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
24250 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
24260 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
24270 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
24280 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
24290 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
242a0 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
242b0 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
242c0 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
242d0 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
242e0 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
242f0 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
24300 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
24310 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24320 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
24330 63 74 69 6f 6e 20 63 61 6c 6c 73 20 70 61 67 65  ction calls page
24340 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 74 6f  rSharedLock() to
24350 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
24360 20 6c 6f 63 6b 20 6f 6e 0a 2a 2a 20 74 68 65 20   lock on.** the 
24370 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
24380 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 6f 72 20   such a lock or 
24390 67 72 65 61 74 65 72 20 69 73 20 6e 6f 74 20 61  greater is not a
243a0 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 2a 2a 20  lready held..** 
243b0 54 68 69 73 20 6d 61 79 20 63 61 75 73 65 20 68  This may cause h
243c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
243d0 61 63 6b 20 6f 72 20 61 20 63 61 63 68 65 20 70  ack or a cache p
243e0 75 72 67 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  urge. See commen
243f0 74 73 0a 2a 2a 20 61 62 6f 76 65 20 66 75 6e 63  ts.** above func
24400 74 69 6f 6e 20 70 61 67 65 72 53 68 61 72 65 64  tion pagerShared
24410 4c 6f 63 6b 28 29 20 66 6f 72 20 64 65 74 61 69  Lock() for detai
24420 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ls..**.** If the
24430 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
24440 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
24450 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
24460 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
24470 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
24480 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
24490 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
244a0 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
244b0 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
244c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
244d0 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
244e0 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
244f0 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
24500 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
24510 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
24520 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
24530 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
24540 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
24550 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
24560 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
24570 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
24580 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
24590 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
245a0 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
245b0 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
245c0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
245d0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
245e0 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
245f0 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
24600 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
24610 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24620 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
24630 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
24640 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
24650 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
24660 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
24670 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
24680 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
24690 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
246a0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
246b0 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
246c0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
246d0 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
246e0 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
246f0 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
24700 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
24710 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
24720 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
24730 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
24740 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
24750 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
24760 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
24770 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
24780 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
24790 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
247a0 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
247b0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
247c0 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
247d0 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
247e0 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
247f0 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
24800 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
24810 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20  in two seperate 
24820 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
24830 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
24840 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
24850 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
24860 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
24870 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
24880 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
24890 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
248a0 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
248b0 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
248c0 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
248d0 20 63 61 63 68 65 20 74 6f 20 70 6f 70 75 6c 61   cache to popula
248e0 74 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  te with the data
248f0 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
24900 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
24910 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
24920 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
24930 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
24940 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
24950 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
24960 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
24970 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24980 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
24990 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
249a0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
249b0 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
249c0 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
249d0 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
249e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
249f0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
24a00 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
24a10 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
24a20 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
24a30 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
24a40 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
24a50 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
24a60 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
24a70 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
24a80 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
24a90 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
24aa0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
24ab0 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
24ac0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
24ad0 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
24ae0 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
24af0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
24b00 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
24b10 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
24b20 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
24b30 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
24b40 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
24b50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
24b60 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
24b70 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
24b80 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
24b90 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
24ba0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
24bb0 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
24bc0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
24bd0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
24be0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
24bf0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
24c00 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
24c10 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
24c20 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
24c30 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
24c40 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
24c50 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
24c60 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
24c70 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
24c80 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
24c90 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
24ca0 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
24cb0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
24cc0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
24cd0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
24ce0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
24cf0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
24d00 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
24d10 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
24d20 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
24d30 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
24d40 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
24d50 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
24d60 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
24d70 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
24d80 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
24d90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24da0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
24db0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
24dc0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
24dd0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
24de0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
24df0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
24e00 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
24e10 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
24e20 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
24e30 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
24e40 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
24e50 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
24e60 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
24e70 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
24e80 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
24e90 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
24ea0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
24eb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
24ec0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  PAGER_UNLOCK .  
24ed0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
24ee0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
24ef0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
24f00 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f   .       || pgno
24f10 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  ==1.  );..  /* T
24f20 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
24f30 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
24f40 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
24f50 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
24f60 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
24f70 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
24f80 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
24f90 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
24fa0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
24fb0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
24fc0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
24fd0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
24fe0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
24ff0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25000 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
25010 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
25020 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
25030 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
25040 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25050 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
25060 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  e = 0;..  /* If 
25070 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
25080 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
25090 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
250a0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
250b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
250c0 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
250d0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
250e0 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
250f0 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
25100 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
25110 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
25120 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
25130 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25140 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
25150 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
25160 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25170 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
25180 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
25190 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
251a0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
251b0 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20  no, 1, &pPg);.  
251c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
251d0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
251e0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
251f0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  ( pPg->pgno==pgn
25200 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
25210 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
25220 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  er || pPg->pPage
25230 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r==0 );.  if( pP
25240 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  g->pPager==0 ){.
25250 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
25260 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
25270 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
25280 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
25290 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
252a0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20  nitialized..    
252b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b  */.    int nMax;
252c0 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
252d0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
252e0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
252f0 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 72  = pPager;..    r
25300 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25310 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
25320 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66  , &nMax);.    if
25330 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25340 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25350 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
25360 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
25370 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
25380 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20   nMax<(int)pgno 
25390 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f  || MEMDB || noCo
253a0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69  ntent ){.      i
253b0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
253c0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
253d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
253e0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
253f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25400 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  FULL;.      }.  
25410 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
25420 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
25430 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
25440 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
25450 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
25460 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
25470 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
25480 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
25490 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
254a0 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
254b0 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
254c0 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
254d0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
254e0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
254f0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
25500 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
25510 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
25520 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
25530 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
25540 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
25550 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
25560 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
25570 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
25580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
25590 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
255a0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
255b0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
255c0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
255d0 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
255e0 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
255f0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
25600 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
25610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
25620 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
25630 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
25640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
25650 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
25660 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
25670 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
25680 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
25690 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
256a0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
256b0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
256c0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
256d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
256e0 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
256f0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
25700 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
25710 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
25720 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
25730 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
25740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25750 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
25760 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
25770 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
25780 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
25790 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
257a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
257b0 61 67 65 72 44 72 6f 70 50 61 67 65 28 70 50 67  agerDropPage(pPg
257c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
257d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
257e0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
257f0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
25800 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
25810 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
25820 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
25830 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
25840 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
25850 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20   is in the page 
25860 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 50 41  cache. */.    PA
25870 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
25880 3e 6e 48 69 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a  >nHit);.  }..  *
25890 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
258a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
258b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
258c0 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
258d0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
258e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
258f0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
25900 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
25910 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
25920 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
25930 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
25940 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
25950 20 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c   in cache. Also,
25960 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
25970 20 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e   .** pager is in
25980 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
25990 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
259a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
259b0 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70  ,.** or if the p
259c0 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
259d0 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
259e0 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
259f0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
25a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
25a10 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
25a20 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
25a30 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
25a40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
25a50 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
25a60 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
25a70 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
25a80 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
25a90 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
25aa0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
25ab0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
25ac0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
25ad0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
25ae0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
25af0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
25b00 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
25b10 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
25b20 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
25b30 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
25b40 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
25b50 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
25b60 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
25b70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
25b80 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
25b90 0a 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ..  if( (pPager-
25ba0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
25bb0 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50 61  LOCK).   && (pPa
25bc0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
25bd0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
25be0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
25bf0 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20  TE_FULL).  ){.  
25c00 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
25c10 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
25c20 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
25c30 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
25c40 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
25c50 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
25c60 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
25c70 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
25c80 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
25c90 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
25ca0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
25cb0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
25cc0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
25cd0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
25ce0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
25cf0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
25d00 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
25d10 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
25d20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
25d30 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
25d40 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
25d50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
25d60 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
25d70 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
25d80 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
25d90 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
25da0 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
25db0 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
25dc0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
25dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
25de0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
25df0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
25e00 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
25e10 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75 72 65 20   opened, ensure 
25e20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d  that the.** sub-
25e30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25e40 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65  open too. If the
25e50 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
25e60 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68   not open,.** th
25e70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
25e80 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
25e90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
25ea0 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
25eb0 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
25ec0 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e   to plan. .** An
25ed0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
25ee0 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
25ef0 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
25f00 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ll to .** sqlite
25f10 33 4f 73 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e  3OsOpen() fails.
25f20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
25f30 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
25f40 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25f50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25f60 4f 4b 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  OK;.  if( isOpen
25f70 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
25f80 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
25f90 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
25fa0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
25fb0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
25fc0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
25fd0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
25fe0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
25ff0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
26000 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
26010 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
26020 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
26030 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
26040 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
26050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
26060 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
26070 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26080 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
26090 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
260a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
260b0 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
260c0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
260d0 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
260e0 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
260f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
26100 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26110 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
26120 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
26130 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
26140 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26150 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
26160 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
26170 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
26180 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
26190 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
261a0 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
261b0 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
261c0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
261d0 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
261e0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
261f0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
26200 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
26210 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
26220 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
26230 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
26240 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
26250 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
26260 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
26270 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
26280 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
26290 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
262a0 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
262b0 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
262c0 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
262d0 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
262e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
262f0 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
26300 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
26310 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
26320 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
26330 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
26340 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
26350 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
26360 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
26370 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
26380 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
26390 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
263a0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
263b0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
263c0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
263d0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
263e0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
263f0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
26400 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
26410 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
26420 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
26430 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
26440 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
26450 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
26460 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
26470 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
26480 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
26490 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
264a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
264b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
264c0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
264d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
264e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
264f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
26500 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
26510 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
26520 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
26530 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
26540 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
26550 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
26560 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
26570 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
26580 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
26590 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
265a0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
265b0 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
265c0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
265d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
265e0 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
265f0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
26600 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
26610 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
26620 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44  e;.  }..  /* TOD
26630 4f 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20  O: Is it really 
26640 70 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20  possible to get 
26650 68 65 72 65 20 77 69 74 68 20 64 62 53 69 7a 65  here with dbSize
26660 56 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74  Valid==0? If not
26670 2c 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20  ,.  ** the call 
26680 74 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e  to PagerPagecoun
26690 74 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76  t() can be remov
266a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ed..  */.  testc
266b0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ase( pPager->dbS
266c0 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20  izeValid==0 );. 
266d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
266e0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
266f0 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  );..  pPager->pI
26700 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
26710 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
26720 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
26730 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
26740 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
26750 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26760 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
26770 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
26780 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
26790 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
267a0 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  n. */.  if( !isO
267b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
267c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
267d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
267e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
267f0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
26800 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
26810 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
26820 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >jfd);.    }else
26830 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
26840 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
26850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
26860 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
26870 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
26880 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
26890 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
268a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
268b0 45 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  E|.        (pPag
268c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a  er->tempFile ? .
268d0 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
268e0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
268f0 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
26900 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
26910 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
26920 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
26930 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  NAL).        );.
26940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
26950 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
26960 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  E.      rc = sql
26970 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
26980 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c  .          pVfs,
26990 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
269a0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
269b0 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
269c0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
269d0 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
269e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
269f0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
26a00 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
26a10 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
26a20 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
26a30 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
26a40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
26a50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26a60 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  fd) );.  }...  /
26a70 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
26a80 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
26a90 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
26aa0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
26ab0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
26ac0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
26ad0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
26ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26af0 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
26b00 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
26b10 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
26b20 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ired. */.    pPa
26b30 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
26b40 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
26b50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
26b60 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
26b70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  ;.    pPager->ne
26b80 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
26b90 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
26ba0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
26bb0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
26bc0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
26bd0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ter = 0;.    pPa
26be0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
26bf0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  = 0;.    rc = wr
26c00 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
26c10 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
26c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26c30 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  & pPager->nSavep
26c40 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  oint ){.    rc =
26c50 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
26c60 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
26c70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26c80 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
26c90 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
26ca0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
26cb0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
26cc0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
26cd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
26cf0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
26d00 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
26d10 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
26d20 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
26d30 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
26d40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
26d50 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
26d60 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
26d70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
26d80 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
26d90 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
26da0 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
26db0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
26dc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26dd0 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
26de0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
26df0 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
26e00 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
26e10 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
26e20 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
26e30 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
26e40 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
26e50 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
26e60 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e  .** If this is n
26e70 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  ot a temporary o
26e80 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
26e90 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61   and, the journa
26ea0 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70  l file is .** op
26eb0 65 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e  ened if it has n
26ec0 6f 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e  ot been already.
26ed0 20 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   For a temporary
26ee0 20 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69   file, the openi
26ef0 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  ng .** of the jo
26f00 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
26f10 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
26f20 72 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20  re is an actual 
26f30 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74  need to .** writ
26f40 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
26f50 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64  . TODO: Why hand
26f60 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
26f70 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a  es differently?.
26f80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
26f90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
26fa0 6e 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73  ned (or if it is
26fb0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20   already open), 
26fc0 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  then a.** journa
26fd0 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l-header is writ
26fe0 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74  ten to the start
26ff0 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   of it..**.** If
27000 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
27010 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
27020 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
27030 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
27040 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
27050 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
27060 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
27070 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
27080 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
27090 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
270a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
270b0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
270c0 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
270d0 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
270e0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
270f0 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
27100 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
27110 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
27120 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
27130 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
27140 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
27150 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
27160 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
27170 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
27180 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
27190 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
271a0 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
271b0 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
271c0 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
271d0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
271e0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
271f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
27200 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
27210 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
27220 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27230 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
27240 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
27250 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50  R_UNLOCK );.  pP
27260 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
27270 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
27280 65 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61  emory;.  if( pPa
27290 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
272a0 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  R_SHARED ){.    
272b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
272c0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
272d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
272e0 4d 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e  MDB && !pPager->
272f0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20  tempFile );..   
27300 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
27310 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
27320 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27330 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
27340 61 72 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20  arameter.    ** 
27350 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
27360 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
27370 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
27380 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
27390 0a 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e  .    ** busy-han
273a0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
273b0 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
273c0 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
273d0 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a  EXCLUSIVE.    **
273e0 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
273f0 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
27400 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
27410 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
27420 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
27430 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
27440 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  VED_LOCK);.    i
27450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27460 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
27470 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
27480 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
27490 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
274a0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
274b0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
274c0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
274d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
274e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
274f0 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
27500 6b 73 20 77 65 72 65 20 73 75 63 63 65 73 73 66  ks were successf
27510 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f  ully obtained, o
27520 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  pen the journal.
27530 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20      ** file and 
27540 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  write the first 
27550 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74  journal-header t
27560 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
27570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27580 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  OK && pPager->us
27590 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 26 26  eJournal.     &&
275a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
275b0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
275c0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
275d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
275e0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
275f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
27600 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f  .  }else if( isO
27610 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27620 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
27630 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
27640 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
27650 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
27660 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  was in exclusive
27670 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
27680 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d   last.    ** tim
27690 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69  e a (read or wri
276a0 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  te) transaction 
276b0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
276c0 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a   concluded.    *
276d0 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63  * by this connec
276e0 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66  tion. Instead of
276f0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
27700 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61  urnal file it wa
27710 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f  s .    ** kept o
27720 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77  pen and either w
27730 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
27740 30 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68  0 bytes or its h
27750 65 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a  eader was.    **
27760 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
27770 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
27780 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27790 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
277a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
277b0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30  r->dbOrigSize==0
277c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
277d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
277e0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  al==0 );.    rc 
277f0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
27800 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
27810 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
27820 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
27830 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
27840 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74  ger)));.  assert
27850 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
27860 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
27870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c  ->journalOff>0 |
27880 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
27890 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
278a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
278b0 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
278c0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
278d0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
278e0 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
278f0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
27900 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
27910 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
27920 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
27930 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
27940 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
27950 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
27960 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
27970 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
27980 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
27990 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
279a0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
279b0 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
279c0 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
279d0 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
279e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
279f0 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
27a00 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
27a10 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
27a20 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
27a30 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
27a40 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
27a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
27a60 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72   Check for error
27a70 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
27a80 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20  ger->errCode ){ 
27a90 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
27aa0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
27ab0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
27ac0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
27ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
27ae0 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  M;.  }..  assert
27af0 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
27b00 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b  ster );..  CHECK
27b10 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
27b20 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
27b30 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
27b40 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
27b50 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
27b60 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
27b70 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
27b80 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
27b90 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
27ba0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
27bb0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
27bc0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
27bd0 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  && !subjRequires
27be0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
27bf0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
27c00 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ied = 1;.  }else
27c10 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  {..    /* If we 
27c20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
27c30 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
27c40 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
27c50 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  .    ** written 
27c60 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
27c70 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
27c80 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
27c90 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62  rnal.    ** or b
27ca0 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oth..    **.    
27cb0 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
27cc0 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
27cd0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
27ce0 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
27cf0 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
27d00 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
27d10 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
27d20 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
27d30 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
27d40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27d50 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 61 67  3PagerBegin(pPag
27d60 65 72 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73  er, 0, pPager->s
27d70 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20  ubjInMemory);.  
27d80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
27da0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
27db0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27dc0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
27dd0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
27de0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
27df0 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
27e00 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  r->useJournal.  
27e10 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
27e20 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
27e30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
27e40 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72  E_OFF ){.      r
27e50 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
27e60 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
27e70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27e80 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
27e90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
27ea0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
27eb0 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  d = 1;.  .    /*
27ec0 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
27ed0 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
27ee0 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
27ef0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
27f00 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
27f10 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
27f20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
27f30 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
27f40 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
27f50 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
27f60 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
27f70 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
27f80 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
27f90 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
27fa0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73  urnal(pPg) && is
27fb0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27fc0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
27fd0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
27fe0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
27ff0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
28000 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
28010 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20  *pData2;..      
28020 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
28030 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
28040 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
28050 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
28060 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
28070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
28080 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
28090 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
280a0 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
280b0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
280c0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
280d0 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
280e0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
280f0 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  r) );.        pD
28100 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
28110 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
28120 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
28130 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
28140 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
28150 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
28160 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
28170 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
28180 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
28190 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  nalOff, pPg->pgn
281a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
281b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
281c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
281d0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
281e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
281f0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
28200 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
28210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28220 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
28230 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
28240 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28250 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
28260 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
28270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28280 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28290 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
282a0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
282b0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
282c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
282d0 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
282e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
282f0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
28300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28310 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
28320 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
28330 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
28340 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
28350 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28360 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
28370 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
28380 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
28390 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
283a0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
283b0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
283c0 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
283d0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
283e0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
283f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
28400 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
28410 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
28420 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
28430 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
28440 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
28450 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
28460 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ));..        /* 
28470 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
28480 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
28490 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a  occurred while j
284a0 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
284b0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
284c0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
284d0 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
284e0 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
284f0 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
28500 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
28510 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
28520 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
28530 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
28540 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
28550 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
28560 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
28570 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
28580 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
28590 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
285a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
285b0 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
285c0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
285d0 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
285e0 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
285f0 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
28600 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28610 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
28620 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
28630 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
28640 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28650 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
28660 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
28670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
28680 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72       /* An error
28690 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72   has occurred wr
286a0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
286b0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a  rnal file. The .
286c0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
286d0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
286e0 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
286f0 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
28700 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28720 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28740 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
28750 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
28760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28770 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
28780 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
28790 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
287a0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
287b0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
287c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
287d0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
287e0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
287f0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
28800 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
28810 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
28820 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61  .        rc |= a
28830 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
28840 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
28850 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
28860 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28870 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
28880 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
28890 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
288a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
288b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
288c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
288d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
288e0 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
288f0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
28900 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
28910 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
28920 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
28930 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
28940 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
28950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
28960 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
28970 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
28980 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
28990 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
289a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
289b0 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
289c0 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
289d0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
289e0 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
289f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
28a00 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
28a10 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
28a20 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
28a30 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
28a40 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
28a50 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
28a60 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
28a70 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
28a80 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
28a90 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
28aa0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
28ab0 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
28ac0 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
28ad0 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
28ae0 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
28af0 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
28b00 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
28b10 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52  */.    if( subjR
28b20 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
28b30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
28b40 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
28b50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
28b60 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
28b70 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
28b80 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
28b90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28ba0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
28bb0 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  RED );.  if( pPa
28bc0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
28bd0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
28be0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
28bf0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
28c00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28c10 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
28c20 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
28c30 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
28c40 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
28c50 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20  fore .** making 
28c60 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
28c70 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  e. The caller mu
28c80 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
28c90 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  urn value .** of
28ca0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
28cb0 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
28cc0 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20  t to change any 
28cd0 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73  page data unless
28ce0 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
28cf0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
28d00 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  _OK..**.** The d
28d10 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
28d20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
28d30 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
28d40 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
28d50 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
28d60 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
28d70 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
28d80 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
28d90 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
28da0 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
28db0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
28dc0 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
28dd0 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
28de0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
28df0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28e00 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
28e10 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
28e20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
28e30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
28e40 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
28e50 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
28e60 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f  s appropriate. O
28e70 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
28e80 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
28e90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
28ea0 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
28eb0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28ec0 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
28ed0 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
28ee0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
28ef0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
28f00 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
28f10 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
28f20 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
28f30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
28f40 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
28f50 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
28f60 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
28f70 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
28f80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
28f90 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
28fa0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
28fd0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
28fe0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
28ff0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
29000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29010 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
29020 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
29030 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
29040 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
29070 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  */.    int needS
29080 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
29090 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
290a0 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e  page has PGHDR_N
290b0 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20  EED_SYNC */..   
290c0 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
290d0 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
290e0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
290f0 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
29100 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
29110 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
29120 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
29130 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
29140 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
29150 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
29160 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
29170 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29180 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
29190 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
291a0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
291b0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
291c0 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
291d0 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
291e0 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
291f0 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
29200 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
29210 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
29220 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
29230 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
29240 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
29250 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
29260 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
29270 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
29280 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
29290 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
292a0 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
292b0 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50  1;..    sqlite3P
292c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
292d0 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
292e0 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69  ageCount);.    i
292f0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
29300 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
29310 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
29320 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
29330 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
29340 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
29350 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
29360 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
29370 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
29380 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29390 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
293a0 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
293b0 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
293c0 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
293d0 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
293e0 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
293f0 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
29400 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
29410 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
29420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
29430 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
29440 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
29450 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
29460 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
29470 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
29480 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
29490 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
294a0 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
294b0 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
294c0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
294d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
294e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
294f0 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
29500 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29530 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
29540 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
29550 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
29560 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
29570 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
29580 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
29590 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
295a0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
295b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
295c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
295d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
295e0 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
295f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
29600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29610 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
29620 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
29630 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
29640 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
29650 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
29660 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
29670 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
29680 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
29690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
296a0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
296b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
296c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
296d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
296e0 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
296f0 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
29700 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
29710 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
29720 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
29730 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
29740 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
29750 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
29760 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
29770 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
29780 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
29790 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
297a0 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
297b0 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
297c0 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
297d0 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
297e0 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
297f0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
29800 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
29810 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
29820 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
29830 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
29840 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
29850 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b  er->noSync==0 );
29860 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
29870 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65   ii<nPage && nee
29880 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  dSync; ii++){.  
29890 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
298a0 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
298b0 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
298c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
298d0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
298e0 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c    pPage->flags |
298f0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
29900 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  C;.          sql
29910 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
29920 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
29930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
29940 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
29950 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a  edSync);.    }..
29960 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29970 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31  er->doNotSync==1
29980 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
29990 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20  doNotSync = 0;. 
299a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
299b0 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
299c0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
299d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
299e0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
299f0 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
29a00 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
29a10 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
29a20 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
29a30 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
29a40 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
29a50 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
29a60 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
29a70 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
29a80 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
29a90 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
29aa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29ab0 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
29ac0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
29ad0 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  urn pPg->flags&P
29ae0 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65  GHDR_DIRTY;.}.#e
29af0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
29b00 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
29b10 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
29b20 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
29b30 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
29b40 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
29b50 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
29b60 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
29b70 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
29b80 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
29b90 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
29ba0 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68  s dirty.  This h
29bb0 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
29bc0 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ple, when.** the
29bd0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
29be0 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f  dded as a leaf o
29bf0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
29c00 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e  nd so its.** con
29c10 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d  tent no longer m
29c20 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atters..**.** Th
29c30 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
29c40 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
29c50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
29c60 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
29c70 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
29c80 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
29c90 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  d. The pager mar
29ca0 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
29cb0 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
29cc0 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
29cd0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
29ce0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
29cf0 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
29d00 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61  mization can qua
29d10 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
29d20 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45   of large .** DE
29d30 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  LETE operations.
29d40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
29d50 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50  PagerDontWrite(P
29d60 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
29d70 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
29d80 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
29d90 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
29da0 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61  DR_DIRTY) && pPa
29db0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
29dc0 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  =0 ){.    PAGERT
29dd0 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54  RACE(("DONT_WRIT
29de0 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
29df0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
29e00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
29e10 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
29e20 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
29e30 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
29e40 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  o)).    pPg->fla
29e50 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54  gs |= PGHDR_DONT
29e60 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53  _WRITE;.#ifdef S
29e70 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
29e80 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
29e90 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
29ea0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
29eb0 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  f.  }.}../*.** T
29ec0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
29ed0 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
29ee0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
29ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29f00 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75  e .** change-cou
29f10 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  nter, stored as 
29f20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 4-byte big-end
29f30 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72  ian integer star
29f40 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65  ting at .** byte
29f50 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
29f60 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a  e pager file..**
29f70 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72  .** If the isDir
29f80 65 63 74 20 66 6c 61 67 20 69 73 20 7a 65 72 6f  ect flag is zero
29f90 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64  , then this is d
29fa0 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a  one by calling .
29fb0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ** sqlite3PagerW
29fc0 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31  rite() on page 1
29fd0 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  , then modifying
29fe0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
29ff0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
2a000 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
2a010 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  the file will be
2a020 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68   updated when th
2a030 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61  e current.** tra
2a040 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2a050 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
2a060 20 69 73 44 69 72 65 63 74 20 66 6c 61 67 20 6d   isDirect flag m
2a070 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
2a080 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
2a090 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
2a0a0 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
2a0b0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2a0c0 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
2a0d0 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
2a0e0 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
2a0f0 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
2a100 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
2a110 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
2a120 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
2a130 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
2a140 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
2a150 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
2a160 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
2a170 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
2a180 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2a190 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
2a1a0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2a1b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2a1c0 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
2a1d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a1e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65  ITE_OK;..  /* De
2a1f0 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61  clare and initia
2a200 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e  lize constant in
2a210 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27  teger 'isDirect'
2a220 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74  . If the.  ** at
2a230 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2a240 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
2a250 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
2a260 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a  , then isDirect.
2a270 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
2a280 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
2a290 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69   passed as the i
2a2a0 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61  sDirectMode para
2a2b0 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  meter.  ** to th
2a2c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
2a2d0 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c  erwise, it is al
2a2e0 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
2a2f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2a300 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20  idea is that if 
2a310 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2a320 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2a330 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65   not.  ** enable
2a340 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2a350 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  e, the compiler 
2a360 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73  can omit the tes
2a370 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69  ts of.  ** 'isDi
2a380 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20  rect' below, as 
2a390 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63  well as the bloc
2a3a0 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68  k enclosed in th
2a3b0 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69  e.  ** "if( isDi
2a3c0 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f  rect )" conditio
2a3d0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
2a3e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2a3f0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 63 6f 6e  OMIC_WRITE.  con
2a400 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20  st int isDirect 
2a410 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
2a420 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29  sDirectMode==0 )
2a430 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2a440 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64  ETER(isDirectMod
2a450 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73  e);.#else.  cons
2a460 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d  t int isDirect =
2a470 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3b 0a 23   isDirectMode;.#
2a480 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2a490 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2a4a0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2a4b0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
2a4c0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2a4d0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
2a4e0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64  ze>0 ){.    PgHd
2a4f0 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20  r *pPgHdr;      
2a500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
2a510 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2a520 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e   */.    u32 chan
2a530 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20  ge_counter;     
2a540 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2a550 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65   value of change
2a560 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a  -counter field *
2a570 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
2a580 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2a590 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2a5a0 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f  r->fd) );..    /
2a5b0 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
2a5c0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
2a5d0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
2a5e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2a5f0 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
2a600 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65  PgHdr);.    asse
2a610 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c  rt( pPgHdr==0 ||
2a620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a630 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67  ;..    /* If pag
2a640 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65  e one was fetche
2a650 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
2a660 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
2a670 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  n is not.    ** 
2a680 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72  operating in dir
2a690 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70  ect-mode, make p
2a6a0 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 0a  age 1 writable..
2a6b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2a6c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a6d0 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20  !isDirect ){.   
2a6e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a6f0 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
2a700 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2a710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a720 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72  ){.      /* Incr
2a730 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
2a740 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
2a750 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
2a760 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20  yte 24. */.     
2a770 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
2a780 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
2a790 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
2a7a0 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
2a7b0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2a7c0 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  ++;.      put32b
2a7d0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
2a7e0 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
2a7f0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
2a800 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e  .      /* If run
2a810 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d  ning in direct m
2a820 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63  ode, write the c
2a830 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
2a840 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a  1 to the file. *
2a850 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69  /.      if( isDi
2a860 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rect ){.        
2a870 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
2a880 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61   = pPgHdr->pData
2a890 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2a8a0 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
2a8b0 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
2a8c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2a8d0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
2a8e0 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
2a8f0 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  pageSize, 0);.  
2a900 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2a910 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  If everything wo
2a920 72 6b 65 64 2c 20 73 65 74 20 74 68 65 20 63 68  rked, set the ch
2a930 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
2a940 61 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ag. */.      if(
2a950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a960 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2a970 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2a980 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
2a990 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
2a9a0 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
2a9b0 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
2a9c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2a9d0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20  f(pPgHdr);.  }. 
2a9e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a9f0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
2aa00 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
2aa10 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
2aa20 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
2aa30 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  files.** or page
2aa40 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
2aa50 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
2aa60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
2aa70 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64  ssful, or called
2aa80 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20   on a pager for 
2aa90 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f  which it is a no
2aaa0 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  -op, this.** fun
2aab0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2aac0 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
2aad0 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  se, an IO error 
2aae0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2aaf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ab00 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
2ab10 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2ab20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab40 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2ab50 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  */.  if( MEMDB |
2ab60 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
2ab70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2ab80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2ab90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2aba0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
2abb0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
2abc0 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72  _flags);.  }.  r
2abd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2abe0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
2abf0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
2ac00 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
2ac10 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
2ac20 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
2ac30 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2ac40 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
2ac50 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
2ac60 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
2ac70 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
2ac80 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
2ac90 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
2aca0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
2acb0 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
2acc0 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
2acd0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
2ace0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
2acf0 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
2ad00 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
2ad10 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2ad20 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
2ad30 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  r is updated,.**
2ad40 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c     * the journal
2ad50 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65   is synced (unle
2ad60 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ss the atomic-wr
2ad70 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2ad80 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20   is used),.**   
2ad90 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  * all dirty page
2ada0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
2adb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2adc0 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20  le, .**   * the 
2add0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2ade0 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72   truncated (if r
2adf0 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a  equired), and.**
2ae00 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2ae10 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a  e file synced. .
2ae20 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  **.** The only t
2ae30 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e  hing that remain
2ae40 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
2ae50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
2ae60 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28  o finalize .** (
2ae70 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
2ae80 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72   or zero the fir
2ae90 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20  st part of) the 
2aea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
2aeb0 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
2aec0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2aed0 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
2aee0 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
2aef0 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
2af00 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
2af10 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
2af20 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
2af30 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
2af40 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2af50 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
2af60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
2af70 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
2af80 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
2af90 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2afa0 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
2afb0 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
2afc0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
2afd0 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
2afe0 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
2aff0 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
2b000 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b010 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
2b020 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
2b030 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
2b040 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2b050 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
2b060 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
2b070 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
2b080 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2b0b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2b0c0 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20   *zMaster,      
2b0d0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
2b0e0 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72  NULL, the master
2b0f0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
2b100 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20  .  int noSync   
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b120 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
2b130 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20  it the xSync on 
2b140 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29  the db file */.)
2b150 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2b160 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2b170 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2b180 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  de */..  if( pPa
2b190 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
2b1a0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
2b1b0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
2b1c0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2b1d0 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
2b1e0 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
2b1f0 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a  s nSize=%d\n", .
2b200 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
2b210 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
2b220 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
2b230 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ));..  /* If thi
2b240 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
2b250 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
2b260 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
2b270 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
2b280 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
2b290 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2b2a0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
2b2b0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
2b2c0 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72   MEMDB && pPager
2b2d0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
2b2e0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
2b2f0 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
2b300 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c  >pBackup);.  }el
2b310 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
2b320 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
2b330 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ED && pPager->db
2b340 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20  Modified ){..   
2b350 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
2b360 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20  g block updates 
2b370 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2b380 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  er. Exactly how 
2b390 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74  it.    ** does t
2b3a0 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  his depends on w
2b3b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
2b3c0 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
2b3d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
2b3e0 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20   ** was enabled 
2b3f0 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2b400 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61   and if this tra
2b410 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74  nsaction meets t
2b420 68 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69  he .    ** runti
2b430 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75  me criteria to u
2b440 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  se the operation
2b450 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  : .    **.    **
2b460 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73      * The file-s
2b470 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74  ystem supports t
2b480 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2b490 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20  property for.   
2b4a0 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20   **      blocks 
2b4b0 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a  of size page-siz
2b4c0 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20  e, and .    **  
2b4d0 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    * This commit 
2b4e0 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
2b4f0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
2b500 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
2b510 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79   **    * Exactly
2b520 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
2b530 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
2b540 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
2b550 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
2b560 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
2b570 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73  optimization was
2b580 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20   not enabled at 
2b590 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
2b5a0 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  en the.    ** pa
2b5b0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2b5c0 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f  ounter() functio
2b5d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75  n is called to u
2b5e0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2b5f0 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20  .    ** counter 
2b600 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64  in 'indirect-mod
2b610 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d  e'. If the optim
2b620 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69  ization is compi
2b630 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a  led in but.    *
2b640 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61  * is not applica
2b650 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e  ble to this tran
2b660 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71  saction, call sq
2b670 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
2b680 74 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  te().    ** to m
2b690 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75  ake sure the jou
2b6a0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63  rnal file has ac
2b6b0 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61  tually been crea
2b6c0 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20  ted, then call. 
2b6d0 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
2b6e0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
2b6f0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
2b700 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e  hange-counter in
2b710 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a   indirect.    **
2b720 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20   mode. .    **. 
2b730 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
2b740 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   if the optimiza
2b750 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61  tion is both ena
2b760 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61  bled and applica
2b770 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ble,.    ** then
2b780 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72   call pager_incr
2b790 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
2b7a0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
2b7b0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20  hange-counter.  
2b7c0 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27    ** in 'direct'
2b7d0 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63   mode. In this c
2b7e0 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
2b7f0 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  file will never 
2b800 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
2b810 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73  d for this trans
2b820 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23  action..    */.#
2b830 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2b840 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2b850 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
2b860 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2b870 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2b880 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
2b890 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2b8a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2b8b0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
2b8c0 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  er && isOpen(pPa
2b8d0 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  ger->jfd) .     
2b8e0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
2b8f0 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65  alOff==jrnlBuffe
2b900 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20  rSize(pPager) . 
2b910 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64      && pPager->d
2b920 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64  bSize>=pPager->d
2b930 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26  bFileSize.     &
2b940 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c  & (0==(pPg = sql
2b950 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
2b960 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
2b970 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d  che)) || 0==pPg-
2b980 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a  >pDirty).    ){.
2b990 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
2b9a0 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e  the db file chan
2b9b0 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74  ge counter via t
2b9c0 68 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20  he direct-write 
2b9d0 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20  method. The .   
2b9e0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
2b9f0 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
2ba00 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
2ba10 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2ba20 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a   page 1 .      *
2ba30 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  * to include the
2ba40 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20   updated change 
2ba50 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
2ba60 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20   write page 1 . 
2ba70 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
2ba80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2ba90 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
2baa0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
2bab0 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  te .      ** pro
2bac0 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73  perty of the hos
2bad0 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  t file-system, t
2bae0 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20  his is safe..   
2baf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2bb00 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2bb10 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
2bb20 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
2bb30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2bb40 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
2bb50 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
2bb60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2bb70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bb80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2bb90 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2bba0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2bbb0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a    }.    }.#else.
2bbc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
2bbd0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2bbe0 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65  r(pPager, 0);.#e
2bbf0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21  ndif.    if( rc!
2bc00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2bc10 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2bc20 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  ne_exit;..    /*
2bc30 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
2bc40 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
2bc50 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
2bc60 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
2bc70 65 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  es.    ** being 
2bc80 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
2bc90 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
2bca0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
2bcb0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
2bcc0 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e  * file. This can
2bcd0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20   only happen in 
2bce0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
2bcf0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2bd00 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74  Before reading t
2bd10 68 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61  he pages with pa
2bd20 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65  ge numbers large
2bd30 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20  r than the .    
2bd40 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ** current value
2bd50 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
2bd60 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61 63  , set dbSize bac
2bd70 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20  k to the value. 
2bd80 20 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f     ** that it to
2bd90 6f 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ok at the start 
2bda0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
2bdb0 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  on. Otherwise, t
2bdc0 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  he.    ** calls 
2bdd0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
2bde0 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f  et() return zero
2bdf0 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64  ed pages instead
2be00 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64   of .    ** read
2be10 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ing data from th
2be20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2be30 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
2be40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2be50 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2be60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
2be70 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2be80 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2be90 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2bea0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2beb0 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  OFF .    ){.    
2bec0 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20    Pgno i;       
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2bef0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2bf00 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
2bf10 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47  Pgno iSkip = PAG
2bf20 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2bf30 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c  r); /* Pending l
2bf40 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ock page */.    
2bf50 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53    const Pgno dbS
2bf60 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2bf70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44  Size;       /* D
2bf80 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69  atabase image si
2bf90 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61  ze */ .      pPa
2bfa0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
2bfb0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2bfc0 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64  ;.      for( i=d
2bfd0 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67  bSize+1; i<=pPag
2bfe0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20  er->dbOrigSize; 
2bff0 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i++ ){.        i
2c000 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
2c010 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
2c020 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
2c030 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
2c040 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2c050 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2c060 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e  /* Page to journ
2c070 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  al */.          
2c080 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c090 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
2c0a0 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
2c0b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c0c0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2c0d0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2c0e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  t;.          rc 
2c0f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c100 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
2c110 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2c120 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
2c130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2c140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2c150 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2c160 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
2c170 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20    }.      } .   
2c180 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2c190 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20  e = dbSize;.    
2c1a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2c1b0 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
2c1c0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
2c1d0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
2c1e0 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65  file. If a maste
2c1f0 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  r .    ** journa
2c200 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
2c210 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
2c220 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
2c230 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a  nal file, .    *
2c240 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20  * or if zMaster 
2c250 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74  is NULL (no mast
2c260 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65  er journal), the
2c270 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  n this call is a
2c280 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
2c290 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
2c2a0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
2c2b0 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
2c2c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c2d0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2c2e0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2c2f0 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
2c300 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2c310 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  If the atomic-up
2c320 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
2c330 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a  n is being.    *
2c340 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c  * used, this cal
2c350 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74  l will not creat
2c360 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2c370 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e  le or perform an
2c380 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f  y.    ** real IO
2c390 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2c3a0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
2c3b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
2c3c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2c3d0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2c3e0 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20  _one_exit;..    
2c3f0 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
2c400 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
2c410 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2c420 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
2c430 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2c440 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2c450 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2c460 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66  PCache));.    if
2c470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c480 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2c490 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
2c4a0 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  R_BLOCKED );.   
2c4b0 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70     goto commit_p
2c4c0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2c4d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2c4e0 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
2c4f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2c500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2c510 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
2c520 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a  not the same siz
2c530 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  e as the databas
2c540 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20  e image,.    ** 
2c550 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74  then use pager_t
2c560 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20  runcate to grow 
2c570 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69  or shrink the fi
2c580 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  le here..    */.
2c590 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2c5a0 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  dbSize!=pPager->
2c5b0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
2c5c0 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20      Pgno nNew = 
2c5d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d  pPager->dbSize -
2c5e0 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
2c5f0 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
2c600 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
2c610 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2c620 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
2c630 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20  LUSIVE );.      
2c640 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
2c650 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77  ate(pPager, nNew
2c660 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2c670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2c680 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2c690 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  ne_exit;.    }..
2c6a0 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
2c6b0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
2c6c0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
2c6d0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
2c6e0 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
2c6f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2c700 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2c710 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
2c720 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
2c730 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
2c740 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
2c750 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
2c760 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2c770 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f  _SYNCED;.  }..co
2c780 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2c790 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
2c7a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
2c7b0 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
2c7c0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2c7d0 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
2c7e0 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
2c7f0 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
2c800 2a 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c  ** lock to spill
2c810 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
2c820 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
2c830 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
2c840 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20      ** there is 
2c850 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
2c860 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
2c870 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 2a  ent, it is.    *
2c880 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75  * better to retu
2c890 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
2c8a0 20 20 20 20 2a 2a 2f 0a 20 20 20 20 72 63 20 3d      **/.    rc =
2c8b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2c8c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c8d0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  .../*.** When th
2c8e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2c8f0 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62  alled, the datab
2c900 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
2c910 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20  n completely.** 
2c920 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
2c930 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d  ct the changes m
2c940 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65  ade by the curre
2c950 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  nt transaction a
2c960 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20  nd.** synced to 
2c970 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61  disk. The journa
2c980 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  l file still exi
2c990 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  sts in the file-
2c9a0 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67  system .** thoug
2c9b0 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c  h, and if a fail
2c9c0 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68  ure occurs at th
2c9d0 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c  is point it will
2c9e0 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62   eventually.** b
2c9f0 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d  e used as a hot-
2ca00 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
2ca10 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
2ca20 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ion rolled back.
2ca30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2ca40 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74  tion finalizes t
2ca50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2ca60 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74   either by delet
2ca70 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74  ing, .** truncat
2ca80 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79  ing or partially
2ca90 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20   zeroing it, so 
2caa0 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62  that it cannot b
2cab0 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68  e used .** for h
2cac0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2cad0 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69  ack. Once this i
2cae0 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73  s done the trans
2caf0 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72  action is.** irr
2cb00 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74  evocably committ
2cb10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2cb20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
2cb30 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2cb40 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2cb50 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65  he pager.** move
2cb60 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  s into the error
2cb70 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
2cb80 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
2cb90 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
2cba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
2cbb0 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
2cbc0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2cbd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2cbe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cbf0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2cc00 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  e */..  /* Do no
2cc10 74 20 70 72 6f 63 65 65 64 20 69 66 20 74 68 65  t proceed if the
2cc20 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64   pager is alread
2cc30 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
2cc40 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tate. */.  if( p
2cc50 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
2cc60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
2cc70 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2cc80 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  }..  /* This fun
2cc90 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
2cca0 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68   be called if th
2ccb0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
2ccc0 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20  n at least.  ** 
2ccd0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
2cce0 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65 64  tate. And indeed
2ccf0 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64 6f   SQLite never do
2cd00 65 73 20 74 68 69 73 2e 20 42 75 74 20 69 74 20  es this. But it 
2cd10 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20  is.  ** nice to 
2cd20 68 61 76 65 20 74 68 69 73 20 64 65 66 65 6e 73  have this defens
2cd30 69 76 65 20 62 6c 6f 63 6b 20 68 65 72 65 20 61  ive block here a
2cd40 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyway..  */.  if
2cd50 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2cd60 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
2cd70 52 56 45 44 29 20 29 7b 0a 20 20 20 20 72 65 74  RVED) ){.    ret
2cd80 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2cd90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 6f  ;.  }..  /* An o
2cda0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20  ptimization. If 
2cdb0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
2cdc0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
2cdd0 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20  dified during.  
2cde0 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ** this transact
2cdf0 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69  ion, the pager i
2ce00 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
2ce10 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20  lusive-mode and 
2ce20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65  is.  ** using pe
2ce30 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
2ce40 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  s, then this fun
2ce50 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2ce60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2ce70 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2ce80 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
2ce90 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  tly contains a s
2cea0 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  ingle journal . 
2ceb0 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20   ** header with 
2cec0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73  the nRec field s
2ced0 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68  et to 0. If such
2cee0 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73   a journal is us
2cef0 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74  ed as.  ** a hot
2cf00 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20  -journal during 
2cf10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
2cf20 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20  back, 0 changes 
2cf30 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a  will be made.  *
2cf40 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
2cf50 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65  e file. So there
2cf60 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a   is no need to z
2cf70 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ero the journal 
2cf80 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69  .  ** header. Si
2cf90 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
2cfa0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2cfb0 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  de, there is no 
2cfc0 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f  need.  ** to dro
2cfd0 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68  p any locks eith
2cfe0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
2cff0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2d000 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  d==0 && pPager->
2d010 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
2d020 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
2d030 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2d040 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
2d050 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  IST.  ){.    ass
2d060 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
2d070 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
2d080 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
2d090 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2d0a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2d0b0 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d  PAGERTRACE(("COM
2d0c0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
2d0d0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
2d0e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2d0f0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
2d100 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  CED || MEMDB || 
2d110 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2d120 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  ied );.  rc = pa
2d130 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2d140 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
2d150 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
2d160 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
2d170 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2d180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
2d190 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
2d1a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
2d1b0 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
2d1c0 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
2d1d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d1e0 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20  on performs two 
2d1f0 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tasks:.**.**   1
2d200 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20  ) It rolls back 
2d210 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d220 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20  , restoring all 
2d230 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
2d240 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65  d .**      in-me
2d250 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
2d260 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68   to the state th
2d270 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20  ey were in when 
2d280 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
2d290 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e  **      was open
2d2a0 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20  ed, and.**   2) 
2d2b0 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65  It finalizes the
2d2c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73   journal file, s
2d2d0 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  o that it is not
2d2e0 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a   used for hot.**
2d2f0 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61        rollback a
2d300 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74  t any point in t
2d310 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  he future..**.**
2d320 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
2d330 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66  following qualif
2d340 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  ications:.**.** 
2d350 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
2d360 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74   file is not yet
2d370 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
2d380 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2d390 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e  ed,.**   then on
2d3a0 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72  ly (2) is perfor
2d3b0 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  med. In this cas
2d3c0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f  e there is no jo
2d3d0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
2d3e0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a  to roll back..**
2d3f0 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65  .** * If in an e
2d400 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
2d410 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
2d420 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29  L, then task (1)
2d430 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72   is .**   perfor
2d440 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66  med. If successf
2d450 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65  ul, task (2). Re
2d460 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
2d470 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20  outcome.**   of 
2d480 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f  either, the erro
2d490 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
2d4a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
2d4b0 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20  o the caller.** 
2d4c0 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53    (i.e. either S
2d4d0 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
2d4e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
2d4f0 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70  **.** * If the p
2d500 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52  ager is in PAGER
2d510 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c  _RESERVED state,
2d520 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31   then attempt (1
2d530 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20  ). Whether.**   
2d540 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75  or not (1) is su
2d550 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61  ccussful, also a
2d560 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73  ttempt (2). If s
2d570 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
2d580 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b  n.**   SQLITE_OK
2d590 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74  . Otherwise, ent
2d5a0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2d5b0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
2d5c0 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72  e first .**   er
2d5d0 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74  ror code encount
2d5e0 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  ered. .**.**   I
2d5f0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
2d600 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
2d610 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2d620 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e   was written to.
2d630 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66   .**   So is saf
2d640 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  e to finalize th
2d650 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2d660 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62  ven if the playb
2d670 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61  ack .**   (opera
2d680 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20  tion 1) failed. 
2d690 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65  However the page
2d6a0 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65  r must enter the
2d6b0 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20   error state.** 
2d6c0 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74    as the content
2d6d0 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  s of the in-memo
2d6e0 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77  ry cache are now
2d6f0 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   suspect..**.** 
2d700 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e  * Finally, if in
2d710 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
2d720 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74   state, then att
2d730 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a  empt (1). Only.*
2d740 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20  *   attempt (2) 
2d750 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73  if (1) is succes
2d760 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c  sful. Return SQL
2d770 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
2d780 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72  sful,.**   other
2d790 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65  wise enter the e
2d7a0 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
2d7b0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
2d7c0 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  code from the .*
2d7d0 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72  *   failing oper
2d7e0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  ation..**.**   I
2d7f0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2d800 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
2d810 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  y have been writ
2d820 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68  ten to. So if th
2d830 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20  e.**   playback 
2d840 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f  operation did no
2d850 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75  t succeed it wou
2d860 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
2d870 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20  o finalize.**   
2d880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d890 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65  . It needs to be
2d8a0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
2d8b0 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74  e-system so that
2d8c0 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72  .**   some other
2d8d0 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65   process can use
2d8e0 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74   it to restore t
2d8f0 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74  he database stat
2d900 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a  e (by.**   hot-j
2d910 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
2d920 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d930 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
2d940 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2d950 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d960 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2d970 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2d980 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52  ode */.  PAGERTR
2d990 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE(("ROLLBACK %
2d9a0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2d9b0 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21  ager)));.  if( !
2d9c0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2d9d0 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  ed || !isOpen(pP
2d9e0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2d9f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
2da00 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2da10 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2da20 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65  Master);.  }else
2da30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2da40 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
2da50 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2da60 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
2da70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2da80 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
2da90 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
2daa0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
2dab0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
2dac0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2dad0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
2dae0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2daf0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
2db00 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
2db10 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  c2;.      rc = p
2db20 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
2db30 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
2db40 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
2db50 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2db60 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2db70 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
2db80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2db90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2dba0 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
2dbb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2dbc0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
2dbd0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
2dbe0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45    }..    if( !ME
2dbf0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
2dc00 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
2dc10 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2dc20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2dc30 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
2dc40 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
2dc50 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
2dc60 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
2dc70 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
2dc80 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
2dc90 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
2dca0 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
2dcb0 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65  .    ** persiste
2dcc0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
2dcd0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
2dce0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d  pPager, rc);.  }
2dcf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dd00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2dd10 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
2dd20 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
2dd30 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
2dd40 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
2dd50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2dd60 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
2dd70 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c  table..*/.u8 sql
2dd80 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
2dd90 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
2dda0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2ddb0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
2ddc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2ddd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
2dde0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2ddf0 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
2de00 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
2de10 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
2de20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2de30 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2de40 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2de50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2de60 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2de70 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2de80 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
2de90 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2dea0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
2deb0 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65  nt(DbPage *pPage
2dec0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2ded0 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
2dee0 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a  count(pPage);.}.
2def0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2df00 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
2df10 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2df20 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
2df30 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
2df40 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
2df50 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
2df60 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
2df70 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
2df80 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  0] = sqlite3Pcac
2df90 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2dfa0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2dfb0 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [1] = sqlite3Pca
2dfc0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
2dfd0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2dfe0 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[2] = sqlite3P
2dff0 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a  cacheGetCachesiz
2e000 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
2e010 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  e);.  a[3] = pPa
2e020 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
2e030 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d   ? (int) pPager-
2e040 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20  >dbSize : -1;.  
2e050 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
2e060 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
2e070 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2e080 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
2e090 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
2e0a0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
2e0b0 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55   a[8] = 0;  /* U
2e0c0 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72  sed to be pPager
2e0d0 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39  ->nOvfl */.  a[9
2e0e0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
2e0f0 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
2e100 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
2e110 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69  eturn a;.}.#endi
2e120 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
2e130 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
2e140 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
2e150 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2e160 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50  e3PagerIsMemdb(P
2e170 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e180 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d   return MEMDB;.}
2e190 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
2e1a0 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20  at there are at 
2e1b0 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74  least nSavepoint
2e1c0 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e   savepoints open
2e1d0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a  . If there are.*
2e1e0 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73  * currently less
2e1f0 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74   than nSavepoint
2e200 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65  s open, then ope
2e210 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  n one or more sa
2e220 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d  vepoints.** to m
2e230 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65  ake up the diffe
2e240 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75  rence. If the nu
2e250 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
2e260 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ts is already.**
2e270 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70   equal to nSavep
2e280 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  oint, then this 
2e290 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2e2a0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  -op..**.** If a 
2e2b0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2e2c0 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  n fails, SQLITE_
2e2d0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
2e2e0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a  d. If an error .
2e2f0 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
2e300 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d  opening the sub-
2e310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2e320 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  en an IO error c
2e330 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ode is.** return
2e340 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  ed. Otherwise, S
2e350 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
2e360 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2e370 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  nSavepoint(Pager
2e380 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53   *pPager, int nS
2e390 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
2e3a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2e3d0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
2e3e0 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72  Current = pPager
2e3f0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  ->nSavepoint;   
2e400 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2e410 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
2e420 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  ints */..  if( n
2e430 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65  Savepoint>nCurre
2e440 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  nt && pPager->us
2e450 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2e460 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e480 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2e490 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
2e4a0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
2e4b0 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20  nt *aNew;       
2e4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e4d0 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ew Pager.aSavepo
2e4e0 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20  int array */..  
2e4f0 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72    /* Either ther
2e500 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a  e is no active j
2e510 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75  ournal or the su
2e520 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  b-journal is ope
2e530 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65  n or .    ** the
2e540 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61   journal is alwa
2e550 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  ys stored in mem
2e560 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ory */.    asser
2e570 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
2e580 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70  point==0 || isOp
2e590 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2e5a0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
2e5b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2e5c0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2e5d0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
2e5e0 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68  ..    /* Grow th
2e5f0 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
2e600 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72  nt array using r
2e610 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e  ealloc(). Return
2e620 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
2e630 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f    ** if the allo
2e640 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74  cation fails. Ot
2e650 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68  herwise, zero th
2e660 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e  e new portion in
2e670 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20   case a .    ** 
2e680 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
2e690 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75  ccurs while popu
2e6a0 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65  lating it in the
2e6b0 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62   for(...) loop b
2e6c0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
2e6d0 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61   aNew = (PagerSa
2e6e0 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65  vepoint *)sqlite
2e6f0 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
2e700 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
2e710 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67  oint, sizeof(Pag
2e720 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61  erSavepoint)*nSa
2e730 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20  vepoint.    );. 
2e740 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a     if( !aNew ){.
2e750 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e760 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2e770 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65  .    memset(&aNe
2e780 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20  w[nCurrent], 0, 
2e790 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72  (nSavepoint-nCur
2e7a0 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50  rent) * sizeof(P
2e7b0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b  agerSavepoint));
2e7c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61  .    pPager->aSa
2e7d0 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a  vepoint = aNew;.
2e7e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
2e7f0 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f  epoint = nSavepo
2e800 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70  int;..    /* Pop
2e810 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53  ulate the PagerS
2e820 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
2e830 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74  res just allocat
2e840 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ed. */.    for(i
2e850 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e  i=nCurrent; ii<n
2e860 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
2e870 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2e880 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
2e890 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65  lid );.      aNe
2e8a0 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50  w[ii].nOrig = pP
2e8b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2e8c0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
2e8d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
2e8e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2e8f0 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  f>0 ){.        a
2e900 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20  New[ii].iOffset 
2e910 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2e920 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lOff;.      }els
2e930 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  e{.        aNew[
2e940 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f  ii].iOffset = JO
2e950 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
2e960 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
2e970 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75      aNew[ii].iSu
2e980 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  bRec = pPager->n
2e990 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e  SubRec;.      aN
2e9a0 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
2e9b0 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  int = sqlite3Bit
2e9c0 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
2e9d0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20  ->dbSize);.     
2e9e0 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70   if( !aNew[ii].p
2e9f0 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  InSavepoint ){. 
2ea00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2ea10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2ea20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2ea30 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
2ea40 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
2ea50 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
2ea60 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ned. */.    rc =
2ea70 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2ea80 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
2ea90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2eaa0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2eab0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
2eac0 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
2ead0 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61  se (commit) a sa
2eae0 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20  vepoint..** The 
2eaf0 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c  savepoint to rel
2eb00 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
2eb10 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65   need not be the
2eb20 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a   most recently .
2eb30 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70  ** created savep
2eb40 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  oint..**.** Para
2eb50 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61  meter op is alwa
2eb60 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  ys either SAVEPO
2eb70 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20  INT_ROLLBACK or 
2eb80 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2eb90 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53  E..** If it is S
2eba0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2ebb0 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61  , then release a
2ebc0 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73  nd destroy the s
2ebd0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a  avepoint with.**
2ebe0 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e   index iSavepoin
2ebf0 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  t. If it is SAVE
2ec00 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
2ec10 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c  then rollback al
2ec20 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61  l changes.** tha
2ec30 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  t have occurred 
2ec40 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66  since the specif
2ec50 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61  ied savepoint wa
2ec60 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
2ec70 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74   The savepoint t
2ec80 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
2ec90 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66  lease is identif
2eca0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
2ecb0 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e   .** iSavepoint.
2ecc0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65   A value of 0 me
2ecd0 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ans to operate o
2ece0 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  n the outermost 
2ecf0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68  savepoint.** (th
2ed00 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29  e first created)
2ed10 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61  . A value of (Pa
2ed20 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
2ed30 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a  ) means operate.
2ed40 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** on the most r
2ed50 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
2ed60 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53  savepoint. If iS
2ed70 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
2ed80 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67  ter than.** (Pag
2ed90 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2eda0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2edb0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2edc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61  .**.** If a nega
2edd0 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61  tive value is pa
2ede0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2edf0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ction, then the 
2ee00 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2ee10 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
2ee20 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
2ee30 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c  ifferent to call
2ee40 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
2ee50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62  agerRollback() b
2ee60 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
2ee70 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65  tion does not te
2ee80 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74  rminate.** the t
2ee90 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e  ransaction or un
2eea0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
2eeb0 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f  e, it just resto
2eec0 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  res the .** cont
2eed0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
2eee0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
2eef0 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  inal state. .**.
2ef00 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20  ** In any case, 
2ef10 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
2ef20 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
2ef30 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
2ef40 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
2ef50 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20  troyed. If this 
2ef60 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65  is a release ope
2ef70 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45  ration (op==SAVE
2ef80 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a  POINT_RELEASE),.
2ef90 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e  ** then savepoin
2efa0 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  t iSavepoint is 
2efb0 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a  also destroyed..
2efc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2efd0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2efe0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2eff0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2f000 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20  on fails,.** or 
2f010 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2f020 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
2f030 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c  occurs while rol
2f040 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20  ling back a .** 
2f050 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f  savepoint. If no
2f060 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53   errors occur, S
2f070 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2f080 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  rned..*/ .int sq
2f090 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
2f0a0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
2f0b0 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
2f0c0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2f0d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f0e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
2f0f0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
2f100 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
2f110 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
2f120 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
2f130 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53  oint>=0 || op==S
2f140 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2f150 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
2f160 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
2f170 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
2f180 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2f190 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2f1a0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
2f1b0 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
2f1c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f1d0 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f  remaining savepo
2f1e0 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20  ints after this 
2f1f0 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  op. */..    /* F
2f200 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
2f210 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ny savepoints wi
2f220 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69  ll still be acti
2f230 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20  ve after this.  
2f240 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
2f250 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65  Store this value
2f260 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66   in nNew. Then f
2f270 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73  ree resources as
2f280 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a  sociated .    **
2f290 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f   with any savepo
2f2a0 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65  ints that are de
2f2b0 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20  stroyed by this 
2f2c0 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
2f2d0 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61  /.    nNew = iSa
2f2e0 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53  vepoint + (op==S
2f2f0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2f300 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e  K);.    for(ii=n
2f310 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  New; ii<pPager->
2f320 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2f330 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2f340 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
2f350 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2f360 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2f370 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
2f380 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2f390 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = nNew;..    /*
2f3a0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f   If this is a ro
2f3b0 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
2f3c0 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73  , playback the s
2f3d0 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69  pecified savepoi
2f3e0 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  nt..    ** If th
2f3f0 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  is is a temp-fil
2f400 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  e, it is possibl
2f410 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
2f420 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20  al file has.    
2f430 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
2f440 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
2f450 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20  case there have 
2f460 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
2f470 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
2f480 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20  tabase file, so 
2f490 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  the playback ope
2f4a0 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b  ration can be sk
2f4b0 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ipped..    */.  
2f4c0 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
2f4d0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20  INT_ROLLBACK && 
2f4e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f4f0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  fd) ){.      Pag
2f500 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
2f510 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d  vepoint = (nNew=
2f520 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61  =0)?0:&pPager->a
2f530 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31  Savepoint[nNew-1
2f540 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ];.      rc = pa
2f550 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
2f560 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61  oint(pPager, pSa
2f570 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
2f580 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54  assert(rc!=SQLIT
2f590 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20  E_DONE);.    }. 
2f5a0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
2f5b0 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66   is a release of
2f5c0 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2f5d0 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61  avepoint, trunca
2f5e0 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  te .    ** the s
2f5f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65  ub-journal to ze
2f600 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
2f610 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65  . */.    if( nNe
2f620 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45  w==0 && op==SAVE
2f630 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26  POINT_RELEASE &&
2f640 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2f650 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  sjfd) ){.      a
2f660 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2f670 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63  E_OK );.      rc
2f680 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
2f690 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  cate(pPager->sjf
2f6a0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  d, 0);.      pPa
2f6b0 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
2f6c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2f6d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2f6e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2f6f0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2f700 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2f710 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2f720 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
2f730 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
2f740 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2f750 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
2f760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2f770 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
2f780 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
2f790 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
2f7a0 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
2f7b0 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
2f7c0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2f7d0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
2f7e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2f7f0 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
2f800 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2f810 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
2f820 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
2f830 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
2f840 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
2f850 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
2f860 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2f870 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
2f880 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
2f890 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
2f8a0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2f8b0 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
2f8c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
2f8d0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
2f8e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2f8f0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2f900 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
2f910 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
2f920 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2f930 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2f940 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
2f950 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
2f960 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
2f970 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
2f980 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
2f990 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
2f9a0 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
2f9b0 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
2f9c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
2f9d0 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
2f9e0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2f9f0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
2fa00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
2fa10 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65  S_CODEC./*.** Se
2fa20 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
2fa30 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
2fa40 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
2fa50 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
2fa60 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
2fa70 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
2fa80 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
2fa90 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
2faa0 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
2fab0 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
2fac0 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
2fad0 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
2fae0 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  rg;.}.#endif..#i
2faf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2fb00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
2fb10 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
2fb20 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e   pPg to location
2fb30 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
2fb40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  e..**.** There m
2fb50 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
2fb60 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2fb70 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
2fb80 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28  ted at.** pgno (
2fb90 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50  which we call pP
2fba0 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61  gOld) though tha
2fbb0 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65  t page is allowe
2fbc0 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61  d to be.** in ca
2fbd0 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  che.  If the pag
2fbe0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
2fbf0 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
2fc00 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
2fc10 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
2fc20 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
2fc30 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
2fc40 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
2fc50 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
2fc60 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
2fc70 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
2fc80 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
2fc90 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
2fca0 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
2fcb0 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
2fcc0 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
2fcd0 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
2fce0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
2fcf0 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
2fd00 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2fd10 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
2fd20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
2fd30 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
2fd40 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2fd50 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
2fd60 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
2fd70 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
2fd80 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
2fd90 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
2fda0 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
2fdb0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
2fdc0 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
2fdd0 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
2fde0 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
2fdf0 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
2fe00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2fe10 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  active)..**.** I
2fe20 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  f the fourth arg
2fe30 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c  ument, isCommit,
2fe40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2fe50 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
2fe60 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61  being.** moved a
2fe70 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61  s part of a data
2fe80 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74  base reorganizat
2fe90 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ion just before 
2fea0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2feb0 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  .** is being com
2fec0 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20  mitted. In this 
2fed0 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72  case, it is guar
2fee0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
2fef0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a  database page .*
2ff00 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20  * pPg refers to 
2ff10 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
2ff20 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74  ten to again wit
2ff30 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
2ff40 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
2ff50 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2ff60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2ff70 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
2ff80 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
2ff90 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68  r.** occurs. Oth
2ffa0 65 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72  erwise, it retur
2ffb0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
2ffc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2ffd0 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
2ffe0 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
2fff0 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pPg, Pgno pgno,
30000 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a   int isCommit){.
30010 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
30020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30030 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
30040 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
30050 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
30060 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Pgno = 0;       
30070 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20  /* Old value of 
30080 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79  pPg->pgno, if sy
30090 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a  nc is required *
300a0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
300b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
300d0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67  */.  Pgno origPg
300e0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
300f0 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    /* The origina
30100 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  l page number */
30110 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
30120 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a  >nRef>0 );..  /*
30130 20 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69   If the page bei
30140 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74  ng moved is dirt
30150 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65  y and has not be
30160 65 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20  en saved by the 
30170 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65  latest.  ** save
30180 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65  point, then save
30190 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
301a0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
301b0 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a  e into the .  **
301c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77   sub-journal now
301d0 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
301e0 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
301f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
30200 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rio:.  **.  **  
30210 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20   BEGIN;.  **    
30220 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
30230 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74  , then modify it
30240 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a   in memory>.  **
30250 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
30260 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  ne;.  **       <
30270 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c  Move page X to l
30280 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20  ocation Y>.  ** 
30290 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
302a0 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  one;.  **.  ** I
302b0 66 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f  f page X were no
302c0 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
302d0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72   sub-journal her
302e0 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
302f0 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
30300 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20   to restore its 
30310 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68  contents when th
30320 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f  e "ROLLBACK TO o
30330 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ne".  ** stateme
30340 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65  nt were is proce
30350 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ssed..  **.  ** 
30360 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29  subjournalPage()
30370 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c   may need to all
30380 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73  ocate space to s
30390 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69  tore pPg->pgno i
303a0 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20  nto.  ** one or 
303b0 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62  more savepoint b
303c0 69 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20  itvecs. This is 
303d0 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20  the reason this 
303e0 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61  function.  ** ma
303f0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
30400 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66  NOMEM..  */.  if
30410 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
30420 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20  DR_DIRTY .   && 
30430 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
30440 28 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49  (pPg).   && SQLI
30450 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62  TE_OK!=(rc = sub
30460 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
30470 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
30480 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  n rc;.  }..  PAG
30490 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  ERTRACE(("MOVE %
304a0 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
304b0 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
304c0 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
304d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
304e0 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d  pPg->pgno, (pPg-
304f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
30500 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e  D_SYNC)?1:0, pgn
30510 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  o));.  IOTRACE((
30520 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
30530 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
30540 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
30550 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
30560 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
30570 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61  nc()ed before pa
30580 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e  ge pPg->pgno can
30590 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
305a0 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e   to, store pPg->
305b0 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61  pgno in local va
305c0 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50  riable needSyncP
305d0 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gno..  **.  ** I
305e0 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  f the isCommit f
305f0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72  lag is set, ther
30600 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
30610 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20  remember that.  
30620 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
30630 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
30640 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
30650 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ase page pPg->pg
30660 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  no .  ** can be 
30670 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
30680 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
30690 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
306a0 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a  to write to it..
306b0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d    */.  if( (pPg-
306c0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
306d0 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f  D_SYNC) && !isCo
306e0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64  mmit ){.    need
306f0 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
30700 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
30710 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
30720 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
30730 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
30740 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
30750 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
30760 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
30770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30780 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
30790 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
307a0 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
307b0 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
307c0 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
307d0 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
307e0 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
307f0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
30800 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
30810 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
30820 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
30830 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
30840 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
30850 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
30860 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
30870 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
30880 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  /.  pPg->flags &
30890 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  = ~PGHDR_NEED_SY
308a0 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70  NC;.  pPgOld = p
308b0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
308c0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
308d0 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20  ert( !pPgOld || 
308e0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20  pPgOld->nRef==1 
308f0 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
30900 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  ){.    pPg->flag
30910 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c  s |= (pPgOld->fl
30920 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
30930 59 4e 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  YNC);.    sqlite
30940 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f  3PcacheDrop(pPgO
30950 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67  ld);.  }..  orig
30960 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
30970 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
30980 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
30990 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
309a0 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
309b0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
309c0 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
309d0 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
309e0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
309f0 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
30a00 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
30a10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
30a20 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
30a30 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
30a40 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
30a50 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
30a60 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
30a70 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
30a80 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
30a90 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
30aa0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
30ab0 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
30ac0 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62  "is journaled" b
30ad0 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62  itvec flag has b
30ae0 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
30af0 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
30b00 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61  ed by.    ** loa
30b10 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ding the page in
30b20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
30b30 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
30b40 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
30b50 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a  c .    ** flag..
30b60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
30b70 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
30b80 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
30b90 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
30ba0 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
30bb0 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
30bc0 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
30bd0 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
30be0 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
30bf0 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
30c00 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
30c10 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
30c20 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
30c30 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
30c40 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
30c50 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
30c60 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
30c70 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
30c80 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
30c90 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
30ca0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
30cb0 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
30cc0 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
30cd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
30ce0 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
30cf0 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
30d00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
30d10 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
30d20 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
30d30 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
30d40 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
30d50 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
30d60 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
30d70 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
30d80 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72      */.    PgHdr
30d90 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
30da0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
30db0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
30dc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
30dd0 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
30de0 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
30df0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
30e00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30e10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
30e20 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64  nJournal && need
30e30 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72  SyncPgno<=pPager
30e40 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
30e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
30e60 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
30e70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
30e80 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20  eedSyncPgno);.  
30e90 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
30ea0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
30eb0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
30ec0 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72  c = 1;.    asser
30ed0 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  t( pPager->noSyn
30ee0 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29  c==0 && !MEMDB )
30ef0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c  ;.    pPgHdr->fl
30f00 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
30f10 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69  D_SYNC;.    sqli
30f20 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
30f30 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
30f40 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
30f50 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
30f60 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e    /*.  ** For an
30f70 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
30f80 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ase, make sure t
30f90 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
30fa0 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20   continues.  ** 
30fb0 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73  to exist, in cas
30fc0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
30fd0 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20  n needs to roll 
30fe0 62 61 63 6b 2e 20 20 57 65 20 61 6c 6c 6f 63 61  back.  We alloca
30ff0 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  te.  ** the page
31000 20 6e 6f 77 2c 20 69 6e 73 74 65 61 64 20 6f 66   now, instead of
31010 20 61 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 62 65   at rollback, be
31020 63 61 75 73 65 20 77 65 20 63 61 6e 20 62 65 74  cause we can bet
31030 74 65 72 20 64 65 61 6c 0a 20 20 2a 2a 20 77 69  ter deal.  ** wi
31040 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  th an out-of-mem
31050 6f 72 79 20 65 72 72 6f 72 20 6e 6f 77 2e 20 20  ory error now.  
31060 54 69 63 6b 65 74 20 23 33 37 36 31 2e 0a 20 20  Ticket #3761..  
31070 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
31080 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4e  {.    DbPage *pN
31090 65 77 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ew;.    rc = sql
310a0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
310b0 28 70 50 61 67 65 72 2c 20 6f 72 69 67 50 67 6e  (pPager, origPgn
310c0 6f 2c 20 26 70 4e 65 77 2c 20 31 29 3b 0a 20 20  o, &pNew, 1);.  
310d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
310e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
310f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
31100 72 55 6e 72 65 66 28 70 4e 65 77 29 3b 0a 20 20  rUnref(pNew);.  
31110 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31120 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
31130 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
31140 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
31150 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63  ata for the spec
31160 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
31170 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
31180 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20  rGetData(DbPage 
31190 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
311a0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20   pPg->nRef>0 || 
311b0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
311c0 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Db );.  return p
311d0 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a  Pg->pData;.}../*
311e0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
311f0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
31200 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
31210 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
31220 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
31230 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
31240 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
31250 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
31260 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
31270 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
31280 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
31290 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
312a0 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45   (pPager?pPg->pE
312b0 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  xtra:0);.}../*.*
312c0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
312d0 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
312e0 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
312f0 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
31300 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
31310 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
31320 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
31330 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
31340 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
31350 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
31360 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
31370 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
31380 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
31390 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
313a0 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
313b0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
313c0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
313d0 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
313e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
313f0 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
31400 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
31410 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
31420 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
31430 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
31440 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
31450 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
31460 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
31470 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
31480 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
31490 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
314a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
314b0 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
314c0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
314d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
314e0 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20  NORMAL.         
314f0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
31500 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
31510 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
31520 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
31530 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  INGMODE_QUERY<0 
31540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
31550 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
31560 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45  ORMAL>=0 && PAGE
31570 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
31580 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20  CLUSIVE>=0 );.  
31590 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20  if( eMode>=0 && 
315a0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
315b0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
315c0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
315d0 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a   (u8)eMode;.  }.
315e0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
315f0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31600 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
31610 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  t/set the journa
31620 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  l-mode for this 
31630 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
31640 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
31650 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
31660 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
31670 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41  E_QUERY.**    PA
31680 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31690 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47  DELETE.**    PAG
316a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
316b0 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41  RUNCATE.**    PA
316c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
316d0 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41  PERSIST.**    PA
316e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
316f0 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  OFF.**    PAGER_
31700 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
31710 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  RY.**.** If the 
31720 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
31730 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68   _QUERY, then th
31740 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69  e journal_mode i
31750 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20  s set to the.** 
31760 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20  value specified 
31770 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  if the change is
31780 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 63   allowed.  The c
31790 68 61 6e 67 65 20 69 73 20 64 69 73 61 6c 6c 6f  hange is disallo
317a0 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66  wed.** for the f
317b0 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73  ollowing reasons
317c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  :.**.**   *  An 
317d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
317e0 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65  se can only have
317f0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   its journal_mod
31800 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a  e set to _OFF.**
31810 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59        or _MEMORY
31820 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  ..**.**   *  The
31830 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61   journal mode ma
31840 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64  y not be changed
31850 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63   while a transac
31860 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
31870 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
31880 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  ed indicate the 
31890 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
318a0 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e  y updated) journ
318b0 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  al-mode..*/.int 
318c0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
318d0 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  nalMode(Pager *p
318e0 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
318f0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
31900 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
31910 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  LMODE_QUERY.    
31920 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
31930 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31940 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  ODE_DELETE.     
31950 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
31960 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
31970 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20  DE_TRUNCATE.    
31980 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
31990 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
319a0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
319b0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
319c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
319d0 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
319e0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
319f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31a00 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73  _MEMORY );.  ass
31a10 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ert( PAGER_JOURN
31a20 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  ALMODE_QUERY<0 )
31a30 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
31a40 0a 20 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c  .   && (!MEMDB |
31a50 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
31a60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
31a70 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y .             
31a80 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
31a90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
31aa0 29 0a 20 20 20 26 26 20 21 70 50 61 67 65 72 2d  ).   && !pPager-
31ab0 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26  >dbModified.   &
31ac0 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65  & (!isOpen(pPage
31ad0 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50  r->jfd) || 0==pP
31ae0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
31af0 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ).  ){.    if( i
31b00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
31b10 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  d) ){.      sqli
31b20 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
31b30 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20  r->jfd);.    }. 
31b40 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
31b50 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  alMode = (u8)eMo
31b60 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
31b70 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
31b80 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urnalMode;.}../*
31b90 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
31ba0 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20  size-limit used 
31bb0 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
31bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
31bd0 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20  .** Setting the 
31be0 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31  size limit to -1
31bf0 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20   means no limit 
31c00 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20  is enforced..** 
31c10 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65  An attempt to se
31c20 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65  t a limit smalle
31c30 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e  r than -1 is a n
31c40 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  o-op..*/.i64 sql
31c50 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
31c60 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20  SizeLimit(Pager 
31c70 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69  *pPager, i64 iLi
31c80 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d  mit){.  if( iLim
31c90 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50  it>=-1 ){.    pP
31ca0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
31cb0 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b  eLimit = iLimit;
31cc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
31cd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
31ce0 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLimit;.}../*.**
31cf0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
31d00 72 20 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d  r to the pPager-
31d10 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c  >pBackup variabl
31d20 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f  e. The backup mo
31d30 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75  dule.** in backu
31d40 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68  p.c maintains th
31d50 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
31d60 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73  s variable. This
31d70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20   module.** uses 
31d80 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61  it opaquely as a
31d90 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  n argument to sq
31da0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
31db0 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69  rt() and.** sqli
31dc0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
31dd0 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74  ) only..*/.sqlit
31de0 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69  e3_backup **sqli
31df0 74 65 33 50 61 67 65 72 42 61 63 6b 75 70 50 74  te3PagerBackupPt
31e00 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
31e10 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61 67  {.  return &pPag
31e20 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a  er->pBackup;.}..
31e30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31e40 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.