/ Hex Artifact Content
Login

Artifact 98c6b2aa232b397ccbcd8ad5a1887af1960de576:


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 34  : pager.c,v 1.54
0350: 36 20 32 30 30 39 2f 30 31 2f 31 30 20 31 37 3a  6 2009/01/10 17:
0360: 30 32 3a 30 33 20 64 72 68 20 45 78 70 20 24 0a  02:03 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 54 68 69      5../*.** Thi
1110: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1120: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1130: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1140: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
1150: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
1160: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
1170: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
1180: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
1190: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
11a0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
11b0: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
11c0: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61  &~7)../*.** A ma
11d0: 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76  cro used for inv
11e0: 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20  oking the codec 
11f0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a  if there is one.
1200: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1210: 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66  _HAS_CODEC.# def
1220: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
1230: 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65  ,X) if( P->xCode
1240: 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65  c!=0 ){ P->xCode
1250: 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44  c(P->pCodecArg,D
1260: 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e  ,N,X); }.# defin
1270: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
1280: 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43  ) ((char*)(P->xC
1290: 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65  odec!=0?P->xCode
12a0: 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44  c(P->pCodecArg,D
12b0: 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a  ,N,X):D)).#else.
12c0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28  # define CODEC1(
12d0: 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f  P,D,N,X) /* NO-O
12e0: 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f  P */.# define CO
12f0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
1300: 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a  char*)D).#endif.
1310: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
1320: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
1330: 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49 66  r size. 16MB. If
1340: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
1350: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
1360: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
1370: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
1380: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
1390: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
13a0: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
13b0: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
13c0: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
13d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
13e0: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
13f0: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
1400: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
1410: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
1420: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
1430: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
1440: 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a 0a 2f  IZE 0x0100000../
1450: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
1460: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1470: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
1480: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
1490: 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65  h active.** save
14a0: 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d  point and statem
14b0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
14c0: 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41  in the system. A
14d0: 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72  ll such structur
14e0: 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  es.** are stored
14f0: 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
1500: 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
1510: 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63  , which is alloc
1520: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69  ated and.** resi
1530: 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  zed using sqlite
1540: 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3Realloc()..**.*
1550: 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  * When a savepoi
1560: 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74  nt is created, t
1570: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
1580: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
1590: 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ld is.** set to 
15a0: 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d  0. If a journal-
15b0: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
15c0: 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  n into the main 
15d0: 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a  journal while.**
15e0: 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
15f0: 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69  s active, then i
1600: 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
1610: 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66   to the byte off
1620: 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  set .** immediat
1630: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
1640: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72  e last journal r
1650: 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e  ecord written in
1660: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  to the main.** j
1670: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68  ournal before th
1680: 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
1690: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
16a0: 65 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f  ed during savepo
16b0: 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  int.** rollback 
16c0: 28 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61  (see pagerPlayba
16d0: 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a  ckSavepoint())..
16e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16f0: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1700: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b   PagerSavepoint;
1710: 0a 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76  .struct PagerSav
1720: 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69  epoint {.  i64 i
1730: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1740: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
1750: 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61  ing offset in ma
1760: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
1770: 69 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20  i64 iHdrOffset; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1790: 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42  See above */.  B
17a0: 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f  itvec *pInSavepo
17b0: 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  int;        /* S
17c0: 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  et of pages in t
17d0: 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f  his savepoint */
17e0: 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20  .  Pgno nOrig;  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62  /* Original numb
1810: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66  er of pages in f
1820: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53  ile */.  Pgno iS
1830: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
1840: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1850: 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69  f first record i
1860: 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  n sub-journal */
1870: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
1880: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
1890: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
18a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
18b0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  ucture..**.** Pa
18c0: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
18d0: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
18e0: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
18f0: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72  ORRUPT, or.** or
1900: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
1910: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
1920: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
1930: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
1940: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
1950: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
1960: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
1970: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
1980: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
1990: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
19a0: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
19b0: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
19c0: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
19d0: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
19e0: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
19f0: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
1a00: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
1a10: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
1a20: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
1a30: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
1a40: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
1a50: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
1a60: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c  ookup().** APIs,
1a70: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
1a80: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
1a90: 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 61  ully..**.** Mana
1aa0: 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ging the size of
1ab0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ac0: 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61  le in pages is a
1ad0: 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61   little complica
1ae0: 74 65 64 2e 0a 2a 2a 20 54 68 65 20 76 61 72 69  ted..** The vari
1af0: 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53 69 7a  able Pager.dbSiz
1b00: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
1b10: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1b20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1b30: 0a 2a 2a 20 69 6d 61 67 65 20 63 75 72 72 65 6e  .** image curren
1b40: 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73  tly contains. As
1b50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1b60: 61 67 65 20 67 72 6f 77 73 20 6f 72 20 73 68 72  age grows or shr
1b70: 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20 76 61 72  inks this.** var
1b80: 69 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64  iable is updated
1b90: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50  . The variable P
1ba0: 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
1bb0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
1bc0: 62 65 72 0a 2a 2a 20 6f 66 20 70 61 67 65 73 20  ber.** of pages 
1bd0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1be0: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1bf0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1c00: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1c10: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
1c20: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
1c30: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
1c40: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
1c50: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f  yet written.** o
1c60: 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ut from the cach
1c70: 65 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20  e to the actual 
1c80: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 4f 72  file on disk. Or
1c90: 20 69 66 20 74 68 65 20 69 6d 61 67 65 20 68 61   if the image ha
1ca0: 73 20 62 65 65 6e 0a 2a 2a 20 74 72 75 6e 63 61  s been.** trunca
1cb0: 74 65 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d  ted by an increm
1cc0: 65 6e 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65  ental-vacuum ope
1cd0: 72 61 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65  ration. The Page
1ce0: 72 2e 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72  r.dbOrigSize var
1cf0: 69 61 62 6c 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e  iable.** contain
1d00: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d10: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
1d20: 61 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e  abase image when
1d30: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1d50: 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f 6e 74  opened. The cont
1d60: 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72 65  ents of all thre
1d70: 65 20 6f 66 20 74 68 65 73 65 20 76 61 72 69 61  e of these varia
1d80: 62 6c 65 73 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  bles is.** only 
1d90: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1da0: 20 63 6f 72 72 65 63 74 20 69 66 20 74 68 65 20   correct if the 
1db0: 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72 2e 64 62  boolean Pager.db
1dc0: 53 69 7a 65 56 61 6c 69 64 20 69 73 20 74 72 75  SizeValid is tru
1dd0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  e..*/.struct Pag
1de0: 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er {.  sqlite3_v
1df0: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20  fs *pVfs;       
1e00: 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f     /* OS functio
1e10: 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f  ns to use for IO
1e20: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
1e30: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
1e40: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
1e50: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
1e60: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
1e70: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
1e80: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
1e90: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
1ea0: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
1eb0: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
1ec0: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
1ed0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
1ee0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1ef0: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
1f00: 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63  /.  u8 noReadloc
1f10: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1f20: 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
1f30: 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c   to obtain readl
1f40: 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  ocks */.  u8 noS
1f50: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
1f60: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
1f70: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
1f80: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
1f90: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
1fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1fb0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
1fc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
1fd0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
1fe0: 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20  8 sync_flags;   
1ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2000: 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c  e of SYNC_NORMAL
2010: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f   or SYNC_FULL */
2020: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2040: 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20  * PAGER_UNLOCK, 
2050: 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56  _SHARED, _RESERV
2060: 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38  ED, etc. */.  u8
2070: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
2080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
2090: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
20a0: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
20b0: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20d0: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
20e0: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
20f0: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2110: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
2120: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
2130: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
2140: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2160: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
2170: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
2180: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
2190: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
21a0: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
21b0: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
21c0: 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  r all pages */. 
21d0: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f0: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
2200: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
2210: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2230: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
2240: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
2250: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
2260: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20    u8 doNotSync; 
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2280: 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20   Boolean. While 
2290: 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69  true, do not spi
22a0: 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  ll the cache */.
22b0: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
22c0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
22d0: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
22e0: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
22f0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
2300: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
2310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2320: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
2330: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
2340: 65 73 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64  es */.  u8 dbMod
2350: 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20 20  ified;          
2360: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2370: 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68 61  here are any cha
2380: 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a  nges to the Db *
2390: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
23a0: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
23b0: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
23c0: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
23d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
23e0: 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69 64    u8 dbSizeValid
23f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2400: 20 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a 65   Set when dbSize
2410: 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20   is correct */. 
2420: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2440: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2450: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2460: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
2470: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2480: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
2490: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
24a0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
24b0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
24c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24d0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
24e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24f0: 6c 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  le */.  u32 vfsF
2500: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2510: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
2520: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
2530: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72  en() */.  int er
2540: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2550: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2560: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
2570: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2580: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
2590: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25a0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
25b0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
25c0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
25d0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
25e0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
25f0: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
2600: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
2610: 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e  m */.  int stmtN
2620: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2630: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2640: 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20  records in stmt 
2650: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
2660: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
2670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2680: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
2690: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
26a0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
26b0: 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  nt pageSize;    
26c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26d0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
26e0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
26f0: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2700: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2710: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
2720: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
2730: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2750: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2760: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
2770: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  in cache */.  Pg
2780: 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20  no mxPgno;      
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
27a0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a  imum allowed siz
27b0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
27c0: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
27d0: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
27e0: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
27f0: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
2800: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2810: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 41   */.  Bitvec *pA
2820: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
2830: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
2840: 20 65 61 63 68 20 70 61 67 65 20 6d 61 72 6b 65   each page marke
2850: 64 20 61 6c 77 61 79 73 2d 72 6f 6c 6c 62 61 63  d always-rollbac
2860: 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  k */.  char *zFi
2870: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2880: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2890: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
28b0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
28c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
28d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
28e0: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
28f0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
2900: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
2910: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
2920: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
2930: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
2940: 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46  , *jfd;     /* F
2950: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2960: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
2970: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
2980: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
2990: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
29a0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
29b0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
29c0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
29d0: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
29e0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
29f0: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
2a00: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
2a10: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
2a20: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
2a30: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
2a40: 64 6c 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  dler */.  i64 jo
2a50: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
2a60: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2a70: 20 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20   byte offset in 
2a80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a90: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
2aa0: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
2ab0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
2ac0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
2ad0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
2ae0: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b00: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
2b10: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
2b20: 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ack */.#ifdef SQ
2b30: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
2b40: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
2b50: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
2b60: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
2b70: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
2b80: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
2b90: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
2ba0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
2bb0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
2bc0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
2bd0: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
2be0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
2bf0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
2c00: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
2c10: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
2c20: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
2c30: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
2c40: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
2c50: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
2c60: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
2c70: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
2c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2c90: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
2ca0: 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66  odec() */.#endif
2cb0: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
2cc0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
2cd0: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2ce0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2cf0: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
2d00: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
2d10: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
2d20: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
2d30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
2d40: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36 34 20  hanges */.  i64 
2d50: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2d60: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
2d70: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
2d80: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
2d90: 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  es */.  PCache *
2da0: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
2db0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2dc0: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
2dd0: 65 63 74 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  ect */.  PagerSa
2de0: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
2df0: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
2e00: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
2e10: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
2e20: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
2e30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e40: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
2e50: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 7d 3b 0a  vepoint[] */.};.
2e60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2e70: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
2e80: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
2e90: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
2ea0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
2eb0: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
2ec0: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
2ed0: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
2ee0: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
2ef0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
2f00: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
2f10: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
2f20: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2f30: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
2f40: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
2f50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f60: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
2f70: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
2f80: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2f90: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
2fa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
2fb0: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
2fc0: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
2fd0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2fe0: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
2ff0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3000: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3010: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66  journal */.# def
3020: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
3030: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
3040: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
3050: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  (v).#endif..../*
3060: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
3070: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
3080: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
3090: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
30a0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
30b0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
30c0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
30d0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
30e0: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
30f0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
3100: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
3110: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
3120: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
3130: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
3140: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
3150: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
3160: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
3170: 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69   is being.** wri
3180: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
3190: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
31a0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
31b0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
31c0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
31d0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
31e0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
31f0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
3200: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
3210: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
3220: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
3230: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
3240: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
3250: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
3260: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
3270: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
3280: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
3290: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
32a0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
32b0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
32c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
32d0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
32e0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
32f0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
3300: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
3310: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
3320: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
3330: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
3340: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
3350: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
3360: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
3370: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
3380: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
3390: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
33a0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
33b0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
33c0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
33d0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
33e0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
33f0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
3400: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
3410: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
3420: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
3430: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
3440: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
3450: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
3460: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
3470: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
3480: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
3490: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
34a0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
34b0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
34c0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
34d0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
34e0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
34f0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
3500: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
3510: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
3520: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
3530: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
3540: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
3550: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
3560: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
3570: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3580: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
3590: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
35a0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
35b0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
35c0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
35d0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
35e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
35f0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
3600: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
3610: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
3620: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
3630: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
3640: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3650: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
3660: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
3670: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
3680: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
3690: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
36a0: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
36b0: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
36c0: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
36d0: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
36e0: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
36f0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
3700: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
3710: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
3720: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
3730: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
3740: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
3750: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
3760: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
3770: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
3780: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
3790: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
37a0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
37b0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
37c0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
37d0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
37e0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
37f0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
3800: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
3810: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
3820: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
3830: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
3840: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
3850: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
3860: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
3870: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
3880: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
3890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
38a0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
38b0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
38c0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
38d0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
38e0: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
38f0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
3900: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
3910: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
3920: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
3930: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
3940: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
3950: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
3960: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
3970: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
3980: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
3990: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
39a0: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
39b0: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
39c0: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
39d0: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
39e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
39f0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
3a00: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
3a10: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
3a20: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
3a30: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
3a40: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
3a50: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
3a60: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
3a70: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
3a80: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
3a90: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3aa0: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 67  _MJ_PGNO(x) ((Pg
3ab0: 6e 6f 29 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  no)((PENDING_BYT
3ac0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
3ad0: 29 29 2b 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ))+1))../*.** Th
3ae0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
3af0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
3b00: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
3b10: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
3b20: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
3b30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
3b40: 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65  ue if it is nece
3b50: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70  ssary to write p
3b60: 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68  age *pPg into th
3b70: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a  e sub-journal..*
3b80: 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74  * A page needs t
3b90: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
3ba0: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
3bb0: 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  l if there exist
3bc0: 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65  s one.** or more
3bd0: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
3be0: 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a   for which:.**.*
3bf0: 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e  *   * The page-n
3c00: 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
3c10: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50  an or equal to P
3c20: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f  agerSavepoint.nO
3c30: 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  rig, and.**   * 
3c40: 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  The bit correspo
3c50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  nding to the pag
3c60: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20  e-number is not 
3c70: 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61  set in.**     Pa
3c80: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
3c90: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  Savepoint..*/.st
3ca0: 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71  atic int subjReq
3cb0: 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20  uiresPage(PgHdr 
3cc0: 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67  *pPg){.  Pgno pg
3cd0: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
3ce0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
3cf0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
3d00: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
3d10: 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  0; i<pPager->nSa
3d20: 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  vepoint; i++){. 
3d30: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
3d40: 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
3d50: 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20  aSavepoint[i];. 
3d60: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e     if( p->nOrig>
3d70: 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69  =pgno && 0==sqli
3d80: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d  te3BitvecTest(p-
3d90: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
3da0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  gno) ){.      re
3db0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
3dc0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3dd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
3de0: 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ue if the page i
3df0: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
3e00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
3e10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
3e20: 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72  eInJournal(PgHdr
3e30: 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
3e40: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
3e50: 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  st(pPg->pPager->
3e60: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
3e70: 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pgno);.}../*.**
3e80: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
3e90: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
3ea0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
3eb0: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
3ec0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
3ed0: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
3ee0: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
3ef0: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
3f00: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
3f10: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
3f20: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
3f30: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
3f40: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
3f50: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
3f60: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
3f70: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
3f80: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
3f90: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
3fa0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
3fb0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
3fc0: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
3fd0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
3fe0: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
3ff0: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
4000: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4010: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
4020: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
4030: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
4040: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
4050: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
4060: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
4070: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
4080: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
4090: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
40a0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
40b0: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
40c0: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
40d0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
40e0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
40f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4100: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4110: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4120: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4130: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4140: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4160: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
4170: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
4180: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
4190: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
41a0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
41b0: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
41c0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
41d0: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
41e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  );.}../*.** If f
41f0: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
4200: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
4210: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
4220: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
4230: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
4240: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
4250: 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d  ck){.  if( !pFd-
4260: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
4270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4280: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
4290: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
42a0: 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  pFd, eLock);.}..
42b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
42c0: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
42d0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
42e0: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
42f0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
4300: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4310: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
4320: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
4330: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
4340: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
4350: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
4360: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
4370: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
4380: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
4390: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
43a0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
43b0: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
43c0: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
43d0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
43e0: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
43f0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
4400: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
4410: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
4420: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
4430: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
4440: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
4450: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
4460: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
4470: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4480: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
4490: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
44a0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
44b0: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
44c0: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
44d0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
44e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
44f0: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
4500: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
4510: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
4520: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64  pPager){.  int d
4530: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
4540: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
4550: 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
4560: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a  nSector;      /*
4570: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
4580: 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20    int szPage;   
4590: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
45a0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
45b0: 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72  ile *fd = pPager
45c0: 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d  ->fd;..  if( fd-
45d0: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
45e0: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
45f0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
4600: 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53  tics(fd);.    nS
4610: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
4620: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
4630: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
4640: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a  >pageSize;.  }..
4650: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
4660: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
4670: 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73  =(512>>8));.  as
4680: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
4690: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
46a0: 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28  536>>8));..  if(
46b0: 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c   !fd->pMethods |
46c0: 7c 20 0a 20 20 20 20 20 20 20 28 64 63 20 26 20  | .       (dc & 
46d0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
46e0: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
46f0: 29 20 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73 7a  ) && nSector<=sz
4700: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Page) ){.    ret
4710: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
4720: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
4730: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4740: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
4750: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
4760: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4770: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
4780: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
4790: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
47a0: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
47b0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
47c0: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
47d0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
47e0: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
47f0: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
4800: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
4810: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
4820: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
4830: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
4840: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
4850: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
4860: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
4870: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
4880: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
4890: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
48a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
48b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
48c0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
48d0: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
48e0: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
48f0: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
4900: 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  n error is clear
4910: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
4920: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
4930: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
4940: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
4950: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
4960: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
4970: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
4980: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
4990: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
49a0: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
49b0: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
49c0: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
49d0: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
49e0: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
49f0: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
4a00: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4a10: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
4a20: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
4a30: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
4a40: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
4a50: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
4a60: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
4a70: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
4a80: 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
4a90: 72 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61  replayed..*/.sta
4aa0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
4ab0: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
4ac0: 67 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ger);.static int
4ad0: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
4ae0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
4af0: 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
4b00: 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
4b10: 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
4b20: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
4b30: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
4b40: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
4b50: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
4b60: 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
4b70: 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
4b80: 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
4b90: 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72    );.  if(.    r
4ba0: 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
4bb0: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
4bc0: 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20  TE_IOERR ||.    
4bd0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52  rc2==SQLITE_CORR
4be0: 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61  UPT.  ){.    pPa
4bf0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
4c00: 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  c;.    if( pPage
4c10: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
4c20: 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20  UNLOCK .     && 
4c30: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
4c40: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
4c50: 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29  Cache)==0 .    )
4c60: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
4c70: 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
4c80: 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c  dy unlocked, cal
4c90: 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  l pager_unlock()
4ca0: 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a   now to.      **
4cb0: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
4cc0: 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72   state and ensur
4cd0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
4ce0: 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20  -cache is .     
4cf0: 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   ** completely e
4d00: 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mpty..      */. 
4d10: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
4d20: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4d30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
4d50: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4d60: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
4d70: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
4d80: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
4d90: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
4da0: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
4db0: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
4dc0: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
4dd0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
4de0: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
4df0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4e00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
4e10: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
4e20: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
4e30: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
4e40: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
4e50: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
4e60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4e70: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
4e80: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
4e90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
4ea0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
4eb0: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
4ec0: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
4ed0: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
4ee0: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
4ef0: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
4f00: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
4f10: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
4f20: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
4f30: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
4f40: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
4f50: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
4f60: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
4f70: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
4f80: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
4f90: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
4fa0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
4fb0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
4fc0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
4fd0: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
4fe0: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
4ff0: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
5000: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
5010: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
5020: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
5030: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
5040: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
5050: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
5060: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
5070: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
5080: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
5090: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
50a0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
50b0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
50c0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
50d0: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
50e0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
50f0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
5100: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
5110: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
5120: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
5130: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
5140: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
5150: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
5160: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
5170: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
5180: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
5190: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
51a0: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
51b0: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
51c0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
51d0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
51e0: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
51f0: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
5200: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
5210: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
5220: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
5230: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
5240: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
5250: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5260: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
5270: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
5280: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
5290: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
52a0: 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20  supplied by the 
52b0: 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a  caller. .**.** z
52c0: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
52d0: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
52e0: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
52f0: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
5300: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
5310: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
5320: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
5330: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
5340: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
5350: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
5360: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
5370: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5380: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
5390: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
53a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
53b0: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
53c0: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
53d0: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
53e0: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
53f0: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
5400: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
5410: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
5420: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
5430: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
5440: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74  **.** If no mast
5450: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5460: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
5470: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5480: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
5490: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
54a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
54b0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
54c0: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
54d0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
54e0: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
54f0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5500: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
5510: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
5520: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
5530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
5540: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
5550: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
5560: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
5570: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
5580: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
5590: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d   header */..  zM
55a0: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
55b0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
55c0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
55d0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
55e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
55f0: 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20  szJ<16 ) return 
5600: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
5610: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
5620: 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69  J-16, &len);.  i
5630: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5640: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5650: 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65   if( len>=nMaste
5660: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
5670: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
5680: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
5690: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
56a0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
56b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
56c0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
56d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
56e0: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
56f0: 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28  8, szJ-8);.  if(
5700: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
5710: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
5720: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
5730: 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  8) ) return rc;.
5740: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5750: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
5760: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
5770: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
5780: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5790: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
57a0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
57b0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53   = '\0';..  /* S
57c0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
57d0: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
57e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
57f0: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
5800: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
5810: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
5820: 65 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66  er[u];.   }.  if
5830: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
5840: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
5850: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
5860: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
5870: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
5880: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
5890: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
58a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
58b0: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
58c0: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
58d0: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
58e0: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
58f0: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
5900: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
5910: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
5920: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
5930: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
5940: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
5950: 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72  \0';.  }.   .  r
5960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
5980: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5990: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
59a0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
59b0: 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a  undary where a.*
59c0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
59d0: 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20   may be read or 
59e0: 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a  written. Pager.j
59f0: 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64  ournalOff is upd
5a00: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
5a10: 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74   new seek offset
5a20: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
5a30: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
5a40: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75   512:.**.** Inpu
5a50: 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20  t Offset        
5a60: 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66        Output Off
5a70: 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  set.** ---------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
5aa0: 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  * 0             
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
5ac0: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
5ad0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
5ae0: 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20  * 100           
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5b00: 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20  ** 2000         
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
5b20: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
5b30: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  i64 journalHdrOf
5b40: 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  fset(Pager *pPag
5b50: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
5b60: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
5b70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5b80: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
5b90: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
5ba0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
5bb0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
5bc0: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
5bd0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
5be0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
5bf0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5c00: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
5c10: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
5c20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
5c30: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
5c40: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
5c50: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65  ;.  return offse
5c60: 74 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  t;.}.static void
5c70: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
5c80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
5c90: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5ca0: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
5cb0: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
5cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
5cd0: 7a 65 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68  zeros over the h
5ce0: 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
5cf0: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73  rnal file.  This
5d00: 20 68 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65   has the.** effe
5d10: 63 74 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69  ct of invalidati
5d20: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
5d30: 69 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69  ile and committi
5d40: 6e 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  ng the.** transa
5d50: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
5d60: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
5d70: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5d80: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
5d90: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
5da0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74  QLITE_OK;.  stat
5db0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
5dc0: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
5dd0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
5de0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
5df0: 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70    i64 iLimit = p
5e00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
5e10: 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f  zeLimit;..    IO
5e20: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
5e30: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
5e40: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
5e50: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
5e60: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5e70: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
5e80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
5e90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5ea0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
5eb0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
5ec0: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
5ed0: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
5ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5ef0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
5f00: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
5f10: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5f20: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
5f30: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
5f40: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
5f50: 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
5f60: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
5f70: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
5f80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5f90: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
5fa0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
5fb0: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
5fc0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
5fd0: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
5fe0: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
5ff0: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
6000: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
6010: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
6020: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
6030: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
6040: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
6050: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
6060: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
6070: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
6080: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
6090: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
60a0: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
60b0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
60c0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
60d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
60e0: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
60f0: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
6100: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6110: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
6120: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
6130: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6140: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
6150: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
6160: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
6170: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
6180: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
6190: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
61a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
61b0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
61c0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
61d0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
61e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
61f0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
6200: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
6210: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
6220: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
6230: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
6240: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
6250: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
6260: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
6270: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
6280: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
6290: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
62a0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
62b0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
62c0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
62d0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
62e0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
62f0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
6300: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
6310: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
6320: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
6330: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
6340: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
6350: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
6360: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
6370: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
6380: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
6390: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
63a0: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
63b0: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
63c0: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
63d0: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
63e0: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
63f0: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
6400: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
6410: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
6420: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
6430: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
6440: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
6450: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
6460: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
6470: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
6480: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
6490: 3b 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 0a  ;.  u32 nWrite;.
64a0: 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 69 66 28    int ii;..  if(
64b0: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
64c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
64d0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
64e0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
64f0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
6500: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
6510: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
6520: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
6530: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 73  m were created s
6540: 69 6e 63 65 20 74 68 65 0a 20 20 2a 2a 20 6d 6f  ince the.  ** mo
6550: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
6560: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
6570: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
6580: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
6590: 69 48 64 72 4f 66 66 0a 20 20 2a 2a 20 66 69 65  iHdrOff.  ** fie
65a0: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
65b0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
65c0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
65d0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
65e0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
65f0: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
6600: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
6610: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
6620: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
6630: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
6640: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
6650: 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  .  seekJournalHd
6660: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  r(pPager);.  pPa
6670: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
6680: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
6690: 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  lOff;..  memcpy(
66a0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
66b0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
66c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
66d0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
66e0: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
66f0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
6700: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
6710: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
6720: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
6730: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
6740: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
6750: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
6760: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
6770: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
6780: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
6790: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
67a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
67b0: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
67c0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
67d0: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
67e0: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
67f0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
6800: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
6810: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
6820: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
6830: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
6840: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
6850: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
6860: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
6870: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
6880: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
6890: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
68a0: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
68b0: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
68c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
68d0: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
68e0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
68f0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
6900: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
6910: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
6920: 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  e occured whilst
6930: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
6940: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
6950: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
6960: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
6970: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
6980: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
6990: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
69a0: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
69b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
69c0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
69d0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
69e0: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
69f0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
6a00: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
6a10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
6a20: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
6a30: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
6a40: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
6a50: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
6a60: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
6a70: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
6a80: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
6a90: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
6aa0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
6ab0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
6ac0: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
6ad0: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
6ae0: 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20  >noSync);.  if( 
6af0: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  (pPager->noSync)
6b00: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
6b10: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
6b20: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
6b30: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
6b40: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
6b50: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
6b60: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
6b70: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
6b80: 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62  .  ){.    put32b
6b90: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6ba0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6bb0: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
6bc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6bd0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6be0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6bf0: 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20  lMagic)], 0);.  
6c00: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
6c10: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
6c20: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
6c30: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
6c40: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
6c50: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
6c60: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6c70: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
6c80: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6c90: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
6ca0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6cb0: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
6cc0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6cd0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
6ce0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6cf0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6d00: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
6d10: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
6d20: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
6d30: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
6d40: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
6d50: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6d60: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6d70: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
6d80: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6d90: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
6da0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
6db0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
6dc0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
6dd0: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
6de0: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
6df0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
6e00: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
6e10: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
6e20: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
6e30: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
6e40: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
6e50: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
6e60: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
6e70: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
6e80: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
6e90: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
6ea0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6eb0: 4d 61 67 69 63 29 2b 31 36 5d 2c 20 30 2c 0a 20  Magic)+16], 0,. 
6ec0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
6ed0: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
6ee0: 4d 61 67 69 63 29 2b 31 36 29 29 3b 0a 0a 20 20  Magic)+16));..  
6ef0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
6f00: 6e 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20  nalHdr==0 ){.   
6f10: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
6f20: 65 20 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69  e */.    put32bi
6f30: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6f40: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6f50: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
6f60: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
6f70: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
6f80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
6f90: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
6fa0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
6fb0: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
6fc0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
6fd0: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
6fe0: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
6ff0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
7000: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
7010: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7020: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
7030: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
7040: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7050: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
7060: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
7070: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
7080: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7090: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
70a0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
70b0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
70c0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
70d0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
70e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
70f0: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
7100: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
7110: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
7120: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
7130: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
7140: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
7150: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
7160: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
7170: 75 72 6e 61 6c 4f 66 66 2e 20 20 53 65 65 20 63  urnalOff.  See c
7180: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
7190: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
71a0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
71b0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
71c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
71d0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
71e0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
71f0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
7200: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
7210: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
7220: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
7230: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
7240: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
7250: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
7260: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
7270: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
7280: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
7290: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
72a0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
72b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
72c0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
72d0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
72e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
72f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
7300: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
7310: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
7320: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
7330: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
7340: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
7350: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
7360: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
7370: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
7380: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
7390: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
73a0: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
73b0: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
73c0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
73d0: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
73e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
73f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
7400: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
7410: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
7420: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
7430: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
7440: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
7450: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
7460: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
7470: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
7480: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
7490: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
74a0: 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20   i64 jrnlOff;.  
74b0: 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 0a 20  u32 iPageSize;. 
74c0: 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65   u32 iSectorSize
74d0: 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  ;..  seekJournal
74e0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
74f0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
7500: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
7510: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
7520: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
7530: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7540: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c  DONE;.  }.  jrnl
7550: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
7560: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20  urnalOff;..  rc 
7570: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
7580: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
7590: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
75a0: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
75b0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
75c0: 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b   rc;.  jrnlOff +
75d0: 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  = sizeof(aMagic)
75e0: 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  ;..  if( memcmp(
75f0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
7600: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
7610: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
7620: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
7630: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
7640: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
7650: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
7660: 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20  , pNRec);.  if( 
7670: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7680: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7690: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
76a0: 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67  jrnlOff+4, &pPag
76b0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
76c0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
76d0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
76e0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
76f0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c  >jfd, jrnlOff+8,
7700: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
7710: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7720: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
7730: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
7740: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
7750: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
7760: 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 26 69  , jrnlOff+16, &i
7770: 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  PageSize);.    i
7780: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7790: 63 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67  c;..    if( iPag
77a0: 65 53 69 7a 65 3c 35 31 32 20 0a 20 20 20 20 20  eSize<512 .     
77b0: 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
77c0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
77d0: 45 20 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  E .     || ((iPa
77e0: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
77f0: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
7800: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
7810: 70 61 67 65 2d 73 69 7a 65 20 69 6e 20 74 68 65  page-size in the
7820: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
7830: 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  is invalid, then
7840: 20 74 68 65 20 70 72 6f 63 65 73 73 0a 20 20 20   the process.   
7850: 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
7860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
7870: 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 63 72  der must have cr
7880: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
7890: 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
78a0: 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
78b0: 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
78c0: 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eading the journ
78d0: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20  al file here..  
78e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
78f0: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
7900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7910: 75 31 36 20 70 61 67 65 73 69 7a 65 20 3d 20 28  u16 pagesize = (
7920: 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20  u16)iPageSize;. 
7930: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7940: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
7950: 65 28 70 50 61 67 65 72 2c 20 26 70 61 67 65 73  e(pPager, &pages
7960: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
7970: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
7980: 4b 20 7c 7c 20 70 61 67 65 73 69 7a 65 3d 3d 28  K || pagesize==(
7990: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
79a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
79b0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
79c0: 20 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20   .    /* Update 
79d0: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
79e0: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
79f0: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
7a00: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
7a10: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
7a20: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
7a30: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
7a40: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
7a50: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
7a60: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
7a70: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
7a80: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
7a90: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
7aa0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
7ab0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
7ac0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
7ad0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
7ae0: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
7af0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
7b00: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
7b10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
7b20: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
7b30: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
7b40: 2b 31 32 2c 20 26 69 53 65 63 74 6f 72 53 69 7a  +12, &iSectorSiz
7b50: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
7b60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7b70: 69 66 28 20 28 69 53 65 63 74 6f 72 53 69 7a 65  if( (iSectorSize
7b80: 26 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29  &(iSectorSize-1)
7b90: 29 0a 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74  ).      || iSect
7ba0: 6f 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20  orSize<512.     
7bb0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
7bc0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
7bd0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
7be0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
7bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
7c00: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
7c10: 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
7c20: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
7c30: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
7c40: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7c50: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7c60: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
7c70: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
7c80: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
7c90: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
7ca0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
7cb0: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
7cc0: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
7cd0: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
7ce0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7cf0: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
7d00: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
7d10: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
7d20: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
7d30: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
7d40: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
7d50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
7d60: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
7d70: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
7d80: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
7d90: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
7da0: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
7db0: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
7dc0: 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  *.** + 4 bytes: 
7dd0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
7de0: 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e  * + N bytes: len
7df0: 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
7e00: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b  urnal name..** +
7e10: 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b   4 bytes: N.** +
7e20: 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
7e30: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
7e40: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62  ecksum..** + 8 b
7e50: 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
7e60: 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
7e70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7e80: 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
7e90: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
7ea0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
7eb0: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
7ec0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ame..**.** If zM
7ed0: 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
7ee0: 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
7ef0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
7f00: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
7f10: 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
7f20: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
7f30: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
7f40: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
7f50: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
7f60: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
7f70: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
7f80: 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20  int len; .  int 
7f90: 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66  i; .  i64 jrnlOf
7fa0: 66 3b 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  f;.  i64 jrnlSiz
7fb0: 65 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  e;.  u32 cksum =
7fc0: 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
7fd0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7fe0: 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69  agic)+2*4];..  i
7ff0: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
8000: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
8010: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
8020: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
8030: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
8040: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
8050: 45 5f 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72  E_MEMORY ) retur
8060: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
8070: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
8080: 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73   = 1;..  len = s
8090: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
80a0: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
80b0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
80c0: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
80d0: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
80e0: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
80f0: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
8100: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
8110: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
8120: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
8130: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8140: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
8150: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
8160: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
8170: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
8180: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
8190: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
81a0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
81b0: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
81c0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
81d0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a  pPager);.  }.  j
81e0: 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
81f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
8200: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8210: 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a  f += (len+20);..
8220: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
8230: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8240: 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d  jrnlOff, PAGER_M
8250: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
8260: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8270: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8280: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34  ;.  jrnlOff += 4
8290: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
82a0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
82b0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  >jfd, zMaster, l
82c0: 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  en, jrnlOff);.  
82d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
82e0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
82f0: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b   jrnlOff += len;
8300: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
8310: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
8320: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
8330: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
8340: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
8350: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
8360: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
8370: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8380: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
8390: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
83a0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
83b0: 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  c), jrnlOff);.  
83c0: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a  jrnlOff += 8+siz
83d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
83e0: 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  c);.  pPager->ne
83f0: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
8400: 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20  ->noSync;..  /* 
8410: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8420: 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75  in peristent-jou
8430: 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20  rnal mode, then 
8440: 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20  the physical .  
8450: 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ** journal-file 
8460: 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20  may extend past 
8470: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
8480: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
8490: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79  me.  ** and 8 by
84a0: 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74  tes of magic dat
84b0: 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74  a just written t
84c0: 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  o the file. This
84d0: 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72   is .  ** danger
84e0: 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ous because the 
84f0: 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  code to rollback
8500: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
8510: 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ile.  ** will no
8520: 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e  t be able to fin
8530: 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  d the master-jou
8540: 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74  rnal name to det
8550: 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
8560: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
8570: 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20  journal is hot. 
8580: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65  .  **.  ** Easie
8590: 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69  st thing to do i
85a0: 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  n this scenario 
85b0: 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  is to truncate t
85c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
85d0: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71   file to the req
85e0: 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f  uired size..  */
85f0: 20 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c   .  if( (rc==SQL
8600: 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72  ITE_OK).   && (r
8610: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
8620: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
8630: 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d  d, &jrnlSize))==
8640: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
8650: 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66  jrnlSize>jrnlOff
8660: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
8670: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
8680: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
8690: 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65  nlOff);.  }.  re
86a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
86b0: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
86c0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
86d0: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
86e0: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  umber.  Return.*
86f0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
8700: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
8710: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
8720: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
8730: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
8740: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
8750: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
8760: 70 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  p;.  sqlite3Pcac
8770: 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
8780: 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
8790: 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  , &p);.  return 
87a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  p;.}../*.** Clea
87b0: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
87c0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
87d0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
87e0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
87f0: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
8800: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
8810: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
8820: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
8830: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
8840: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
8850: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
8860: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
8870: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
8880: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
8890: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
88a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
88b0: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
88c0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
88d0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
88e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
88f0: 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
8900: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
8910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
8920: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
8930: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
8940: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
8950: 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
8960: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
8970: 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
8980: 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
8990: 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
89a0: 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
89b0: 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
89c0: 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
89d0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
89e0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
89f0: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 50  seAllSavepoint(P
8a00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
8a10: 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69   int ii;.  for(i
8a20: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
8a30: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
8a40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
8a50: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
8a60: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
8a70: 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
8a80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
8a90: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
8aa0: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
8ab0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
8ac0: 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >sjfd);.  }.  sq
8ad0: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
8ae0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r->aSavepoint);.
8af0: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
8b00: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
8b10: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
8b20: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
8b30: 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  mtNRec = 0;.}../
8b40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74  *.** Set the bit
8b50: 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
8b60: 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
8b70: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
8b80: 62 69 74 76 65 63 73 20 6f 66 0a 2a 2a 20 61 6c  bitvecs of.** al
8b90: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
8ba0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
8bb0: 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
8bc0: 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
8bd0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
8be0: 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c00: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8c10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8c20: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
8c30: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
8c40: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
8c50: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
8c60: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
8c70: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
8c80: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
8c90: 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
8ca0: 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
8cb0: 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
8cc0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
8cd0: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
8ce0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
8cf0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
8d00: 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
8d10: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
8d20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8d30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
8d40: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
8d50: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
8d60: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
8d70: 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72  rrently in error
8d80: 20 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20   state, discard 
8d90: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
8da0: 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e  .** the cache an
8db0: 64 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65  d reset the Page
8dc0: 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65  r structure inte
8dd0: 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74  rnal state. If t
8de0: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70  here is.** an op
8df0: 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c  en journal-file,
8e00: 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74   then the next t
8e10: 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63  ime a shared-loc
8e20: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  k is obtained.**
8e30: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69   on the pager fi
8e40: 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61  le (by this or a
8e50: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
8e60: 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a  ), it will be.**
8e70: 20 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f   treated as a ho
8e80: 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
8e90: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
8ea0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
8eb0: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
8ec0: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
8ed0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
8ee0: 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
8ef0: 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  c = osUnlock(pPa
8f00: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
8f10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
8f20: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
8f30: 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  = rc;.    pPager
8f40: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
8f50: 30 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  0;.    IOTRACE((
8f60: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
8f70: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20  Pager))..    /* 
8f80: 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65  Always close the
8f90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
8fa0: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
8fb0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20  database lock.. 
8fc0: 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
8fd0: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
8fe0: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
8ff0: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
9000: 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  ht.    ** delete
9010: 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72   the file out fr
9020: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
9030: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
9040: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
9050: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9060: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
9070: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
9080: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
9090: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
90a0: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
90b0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
90c0: 61 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  al);.      pPage
90d0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
90e0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
90f0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
9100: 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
9110: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 70 50  lback);.      pP
9120: 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
9130: 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  lback = 0;.    }
9140: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65  ..    /* If Page
9150: 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
9160: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
9170: 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
9180: 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20  e cannot be.    
9190: 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
91a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 66  that the pager f
91b0: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c  ile is unlocked,
91c0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
91d0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 63 68   the.    ** cach
91e0: 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64  e can be discard
91f0: 65 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ed and the error
9200: 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65   code safely cle
9210: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
9220: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
9230: 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Code ){.      if
9240: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9250: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
9260: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
9270: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
9280: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
9290: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
92a0: 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  int(pPager);.   
92b0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
92c0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
92d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
92e0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
92f0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
9300: 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  gSize = 0;.    }
9310: 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
9320: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
9330: 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  CK;.    pPager->
9340: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9350: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
9360: 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c  * Execute a roll
9370: 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61  back if a transa
9380: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
9390: 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
93a0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
93b0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  . If the pager h
93c0: 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
93d0: 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
93e0: 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61  te, .** do not a
93f0: 74 74 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c 62  ttempt the rollb
9400: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
9410: 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
9420: 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
9430: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65   *p){.  if( p->e
9440: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
9450: 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50  K && p->state>=P
9460: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
9470: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
9480: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
9490: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
94a0: 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  rRollback(p);.  
94b0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
94c0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
94d0: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
94e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
94f0: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
9500: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
9510: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
9520: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
9530: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
9540: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
9550: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
9560: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
9570: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
9580: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
9590: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
95a0: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
95b0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
95c0: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
95d0: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
95e0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
95f0: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
9600: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
9610: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
9620: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
9630: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
9640: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
9650: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
9660: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
9670: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
9680: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
9690: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
96a0: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
96b0: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
96c0: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
96d0: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
96e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
96f0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
9700: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
9710: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
9720: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
9730: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
9740: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
9750: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
9760: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
9770: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
9780: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
9790: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
97a0: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
97b0: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
97c0: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
97d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
97e0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
97f0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
9800: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
9810: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
9820: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
9830: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
9840: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9850: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
9860: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
9870: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9880: 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  }.  releaseAllSa
9890: 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b  vepoint(pPager);
98a0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
98b0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
98c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
98d0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
98e0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
98f0: 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
9900: 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c   isMemoryJournal
9910: 20 3d 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a   = sqlite3IsMemJ
9920: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
9930: 66 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fd);.      sqlit
9940: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
9950: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50  ->jfd);.      pP
9960: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
9970: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  n = 0;.      if(
9980: 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61   !isMemoryJourna
9990: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
99a0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
99b0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
99c0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
99d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
99e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
99f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
9a00: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9a10: 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20  DE_TRUNCATE.    
9a20: 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71       && (rc = sq
9a30: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
9a40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29  pPager->jfd, 0))
9a50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9a60: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
9a70: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
9a80: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9a90: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
9aa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
9ab0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
9ac0: 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  de .     || pPag
9ad0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
9ae0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9af0: 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29  DE_PERSIST.    )
9b00: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
9b10: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
9b20: 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
9b30: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
9b40: 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
9b50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
9b60: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
9b70: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9b80: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
9b90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ba0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9bb0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9bc0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
9bd0: 45 4c 45 54 45 20 7c 7c 20 72 63 20 29 3b 0a 20  ELETE || rc );. 
9be0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
9bf0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
9c00: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
9c10: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
9c20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
9c30: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
9c40: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
9c50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9c60: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
9c70: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
9c80: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
9c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ca0: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
9cb0: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
9cc0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
9cd0: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
9ce0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  rnal = 0;.    sq
9cf0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
9d00: 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61  oy(pPager->pAlwa
9d10: 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ysRollback);.   
9d20: 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73   pPager->pAlways
9d30: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69  Rollback = 0;.#i
9d40: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
9d50: 4b 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69  K_PAGES.    sqli
9d60: 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
9d70: 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
9d80: 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74  Cache, pager_set
9d90: 5f 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64  _pagehash);.#end
9da0: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  if.    sqlite3Pc
9db0: 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
9dc0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
9dd0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
9de0: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
9df0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
9e00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
9e10: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
9e20: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
9e30: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
9e40: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
9e50: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
9e60: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
9e70: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
9e80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
9e90: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
9ea0: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
9eb0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
9ec0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
9ed0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
9ee0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
9ef0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
9f00: 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b  >dbOrigSize = 0;
9f10: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
9f20: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
9f30: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
9f40: 3b 0a 20 20 2f 2a 20 6c 72 75 4c 69 73 74 53 65  ;.  /* lruListSe
9f50: 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61  tFirstSynced(pPa
9f60: 67 65 72 29 3b 20 2a 2f 0a 20 20 73 71 6c 69 74  ger); */.  sqlit
9f70: 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
9f80: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
9f90: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
9fa0: 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  );.  if( !MEMDB 
9fb0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
9fc0: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
9fd0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
9fe0: 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20  Modified = 0;.. 
9ff0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
a000: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
a010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
a020: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
a030: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
a040: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
a050: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
a060: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
a070: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
a080: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
a090: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
a0a0: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
a0b0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
a0c0: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
a0d0: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
a0e0: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
a0f0: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
a100: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
a110: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
a120: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
a130: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
a140: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
a150: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
a160: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
a170: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
a180: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
a190: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
a1a0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
a1b0: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
a1c0: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
a1d0: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
a1e0: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
a1f0: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
a200: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
a210: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
a220: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
a230: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
a240: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
a250: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
a260: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
a270: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
a280: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
a290: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
a2a0: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
a2b0: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
a2c0: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
a2d0: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
a2e0: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
a2f0: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
a300: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
a310: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
a320: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
a330: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
a340: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
a350: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
a360: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
a370: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
a380: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
a390: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
a3a0: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
a3b0: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
a3c0: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
a3d0: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
a3e0: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
a3f0: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
a400: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
a410: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
a420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
a430: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
a440: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
a450: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
a460: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
a470: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
a480: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
a490: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
a4a0: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
a4b0: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
a4c0: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
a4d0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a4e0: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
a4f0: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
a500: 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
a510: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a520: 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
a530: 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
a540: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
a550: 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
a560: 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
a570: 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
a580: 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
a590: 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
a5a0: 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
a5b0: 68 65 20 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  he  *pOffset.** 
a5c0: 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
a5d0: 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
a5e0: 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
a5f0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
a600: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69  .**.** The isMai
a610: 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72  nJrnl flag is tr
a620: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ue if this is th
a630: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
a640: 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66  journal and.** f
a650: 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61  alse for the sta
a660: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
a670: 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
a680: 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a  ck journal uses.
a690: 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  ** checksums - t
a6a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
a6b0: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  rnal does not..*
a6c0: 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
a6d0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
a6e0: 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
a6f0: 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
a700: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
a710: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
a720: 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
a730: 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
a740: 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
a750: 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
a760: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
a770: 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
a780: 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
a790: 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
a7a0: 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
a7b0: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
a7c0: 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
a7d0: 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
a7e0: 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
a7f0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
a800: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
a810: 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
a820: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
a830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a840: 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
a850: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
a860: 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a880: 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
a890: 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
a8a0: 6e 61 6c 2e 20 2a 2f 0a 20 20 69 36 34 20 2a 70  nal. */.  i64 *p
a8b0: 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
a8c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
a8d0: 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
a8e0: 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  layback */.  int
a8f0: 20 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20 20   isSavepnt,     
a900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a910: 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
a920: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  nt rollback */. 
a930: 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 20   Bitvec *pDone  
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a950: 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
a960: 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
a970: 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e   back */.){.  in
a980: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
a990: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
a9a0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
a9b0: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
a9c0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
a9d0: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
a9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a9f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
aa00: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
aa10: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
aa20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aa30: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
aa40: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
aa50: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
aa60: 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aa80: 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
aa90: 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
aaa0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
aab0: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
aac0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
aad0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
aae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
aaf0: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
ab00: 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
ab10: 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
ab20: 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
ab30: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
ab40: 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
ab50: 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
ab60: 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
ab70: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
ab80: 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
ab90: 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
aba0: 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
abb0: 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
abc0: 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
abd0: 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
abe0: 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
abf0: 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
ac00: 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
ac10: 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65  ata = (u8*)pPage
ac20: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
ac30: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
ac40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
ac50: 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
ac60: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
ac70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
ac80: 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c  jfd = isMainJrnl
ac90: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
aca0: 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 0a   pPager->sjfd;..
acb0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
acc0: 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c  s(jfd, *pOffset,
acd0: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
ace0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
acf0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
ad00: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
ad10: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
ad20: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
ad30: 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
ad40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ad50: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
ad60: 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
ad70: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
ad80: 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
ad90: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
ada0: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
adb0: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
adc0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
add0: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
ade0: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
adf0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
ae00: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
ae10: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
ae20: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
ae30: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
ae40: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
ae50: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ae60: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
ae70: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
ae80: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
ae90: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
aea0: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
aeb0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
aec0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
aed0: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
aee0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
aef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
af00: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
af10: 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
af20: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
af30: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
af40: 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
af50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
af60: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
af70: 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
af80: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
af90: 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
afa0: 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
afb0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
afc0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
afd0: 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
afe0: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
aff0: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
b000: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b010: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
b020: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 6f   }.  }.  if( pDo
b030: 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69  ne && (rc = sqli
b040: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f  te3BitvecSet(pDo
b050: 6e 65 2c 20 70 67 6e 6f 29 29 20 29 7b 0a 20 20  ne, pgno)) ){.  
b060: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
b070: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b080: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
b090: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
b0a0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
b0b0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
b0c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b0d0: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
b0e0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
b0f0: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
b100: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
b110: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
b120: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
b130: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
b140: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
b150: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
b160: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
b170: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
b180: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
b190: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
b1a0: 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
b1b0: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
b1c0: 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
b1d0: 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
b1e0: 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
b1f0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
b200: 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
b210: 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
b220: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
b230: 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
b240: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
b250: 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
b260: 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
b270: 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
b280: 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
b290: 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
b2a0: 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
b2b0: 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
b2c0: 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
b2d0: 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
b2e0: 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
b2f0: 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
b300: 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
b310: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
b320: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
b330: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
b340: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
b350: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
b360: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
b370: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
b380: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
b390: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
b3a0: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
b3b0: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
b3c0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
b3d0: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
b3e0: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
b3f0: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
b400: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
b410: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
b420: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
b430: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
b440: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
b450: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
b460: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
b470: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
b480: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
b490: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
b4a0: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
b4b0: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
b4c0: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
b4d0: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
b4e0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
b4f0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
b500: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
b510: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
b520: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
b530: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
b540: 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
b550: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
b560: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
b570: 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
b580: 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
b590: 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
b5a0: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
b5b0: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
b5c0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
b5d0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b5e0: 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
b5f0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
b600: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
b610: 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
b620: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
b630: 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
b640: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
b650: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b660: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
b670: 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
b680: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
b690: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
b6a0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
b6b0: 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
b6c0: 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
b6d0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
b6e0: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
b6f0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
b700: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
b710: 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
b720: 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
b730: 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
b740: 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
b750: 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
b760: 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
b770: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
b780: 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
b790: 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
b7a0: 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
b7b0: 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
b7c0: 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
b7d0: 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
b7e0: 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
b7f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
b800: 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
b810: 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ed..  */.  pPg =
b820: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
b830: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50  ager, pgno);.  P
b840: 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
b850: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
b860: 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
b870: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b880: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
b890: 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
b8a0: 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
b8b0: 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 2c  ageSize, aData),
b8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b8d0: 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
b8e0: 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
b8f0: 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
b900: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73    if( (pPager->s
b910: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
b920: 55 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50  USIVE).   && (pP
b930: 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
b940: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
b950: 44 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 28  D_SYNC)).   && (
b960: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
b970: 68 6f 64 73 29 0a 20 20 29 7b 0a 20 20 20 20 69  hods).  ){.    i
b980: 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
b990: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
b9a0: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
b9b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
b9c0: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
b9d0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
b9e0: 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
b9f0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
ba00: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
ba10: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
ba20: 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
ba30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
ba40: 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  if( !isMainJrnl 
ba50: 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  && pPg==0 ){.   
ba60: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
ba70: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73   rollback of a s
ba80: 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74  avepoint and dat
ba90: 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65  a was not writte
baa0: 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n to.    ** the 
bab0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
bac0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d   page is not in-
bad0: 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73  memory, there is
bae0: 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20   a potential.   
baf0: 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65   ** problem. Whe
bb00: 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65  n the page is ne
bb10: 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68  xt fetched by th
bb20: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20  e b-tree layer, 
bb30: 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
bb40: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
bb50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
bb60: 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
bb70: 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20   not be .    ** 
bb80: 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a  current. .    **
bb90: 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
bba0: 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69  e a couple of di
bbb0: 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69  fferent ways thi
bbc0: 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c  s can happen. Al
bbd0: 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20  l are quite.    
bbe0: 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e  ** obscure. When
bbf0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63   running in sync
bc00: 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68  hronous mode, th
bc10: 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
bc20: 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  en .    ** if th
bc30: 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65  e page is on the
bc40: 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68   free-list at th
bc50: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
bc60: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
bc70: 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  .    ** populate
bc80: 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73  d, then moved us
bc90: 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
bca0: 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20  Movepage()..    
bcb0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
bcc0: 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64  lution is to add
bcd0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
bce0: 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20  ge to the cache 
bcf0: 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a  containing.    *
bd00: 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20  * the data just 
bd10: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75  read from the su
bd20: 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20  b-journal. Mark 
bd30: 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
bd40: 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66  y .    ** and if
bd50: 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69   the pager requi
bd60: 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  res a journal-sy
bd70: 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  nc, then mark th
bd80: 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a  e page as .    *
bd90: 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f  * requiring a jo
bda0: 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72  urnal-sync befor
bdb0: 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e  e it is written.
bdc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
bdd0: 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b  rt( isSavepnt );
bde0: 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73  .    if( (rc = s
bdf0: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
be00: 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
be10: 20 26 70 50 67 2c 20 31 29 29 20 29 7b 0a 20 20   &pPg, 1)) ){.  
be20: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
be30: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c     }.    pPg->fl
be40: 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
be50: 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
be60: 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
be70: 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
be80: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
be90: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
bea0: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
beb0: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
bec0: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
bed0: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
bee0: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
bef0: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
bf00: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
bf10: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
bf20: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
bf30: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
bf40: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
bf50: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
bf60: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
bf70: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
bf80: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
bf90: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
bfa0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
bfb0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
bfc0: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
bfd0: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
bfe0: 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
bff0: 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
c000: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
c010: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c020: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
c030: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
c040: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
c050: 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
c060: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4d 61    }.    if( isMa
c070: 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
c080: 76 65 70 6e 74 20 7c 7c 20 70 50 61 67 65 72 2d  vepnt || pPager-
c090: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 3d 70 50 61  >journalOff<=pPa
c0a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
c0b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
c0c0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
c0d0: 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
c0e0: 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
c0f0: 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
c100: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
c110: 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
c120: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
c130: 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
c140: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
c150: 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
c160: 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
c170: 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
c180: 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
c190: 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
c1a0: 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
c1b0: 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
c1c0: 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
c1d0: 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
c1e0: 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
c1f0: 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
c200: 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
c210: 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
c220: 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
c230: 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
c240: 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
c250: 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
c260: 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
c270: 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
c280: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
c290: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
c2a0: 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
c2b0: 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
c2c0: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
c2d0: 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
c2e0: 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
c2f0: 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
c300: 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
c310: 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
c320: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
c330: 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
c340: 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
c350: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
c360: 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
c370: 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
c380: 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
c390: 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
c3a0: 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
c3b0: 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
c3c0: 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
c3d0: 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
c3e0: 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
c3f0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
c400: 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
c410: 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
c420: 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
c430: 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
c440: 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
c450: 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
c460: 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
c470: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
c480: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
c490: 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
c4a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
c4b0: 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
c4c0: 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
c4d0: 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
c4e0: 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
c4f0: 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
c500: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
c510: 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
c520: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
c530: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
c540: 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23  an(pPg);.    }.#
c550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
c560: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
c570: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c580: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
c590: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
c5a0: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
c5b0: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
c5c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
c5d0: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
c5e0: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
c5f0: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
c600: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
c610: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
c620: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
c630: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
c640: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
c650: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
c660: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
c670: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
c680: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
c690: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
c6a0: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
c6b0: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
c6c0: 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c  gno, 3);.    sql
c6d0: 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
c6e0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
c6f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
c700: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
c710: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
c720: 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
c730: 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
c740: 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65 61 64  tine looks ahead
c750: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
c760: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
c770: 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68  determines.** wh
c780: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
c790: 20 6e 65 78 74 20 72 65 63 6f 72 64 20 28 74 68   next record (th
c7a0: 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 62 65  e record that be
c7b0: 67 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a 2a 20  gins at file.** 
c7c0: 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 6a  offset pPager->j
c7d0: 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73 20 61 20  ournalOff) is a 
c7e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 67 65  well-formed page
c7f0: 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 69   record consisti
c800: 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c 69 64  ng.** of a valid
c810: 20 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 70 50   page number, pP
c820: 61 67 65 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  age->pageSize by
c830: 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2c 20  tes of content, 
c840: 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20 61  followed.** by a
c850: 20 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d 2e   valid checksum.
c860: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
c870: 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
c880: 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f 72 64  know this in ord
c890: 65 72 20 74 6f 20 64 6f 20 69 74 73 20 6a 6f 62  er to do its job
c8a0: 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  .   This.** rout
c8b0: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ine is only used
c8c0: 20 66 72 6f 6d 20 77 69 74 68 20 61 73 73 65 72   from with asser
c8d0: 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
c8e0: 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 73 74  () macros..*/.st
c8f0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4e 65  atic int pagerNe
c900: 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56  xtJournalPageIsV
c910: 61 6c 69 64 28 50 61 67 65 72 20 2a 70 50 61 67  alid(Pager *pPag
c920: 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  er){.  Pgno pgno
c930: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
c940: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
c950: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
c960: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
c970: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
c980: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
c990: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
c9a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
c9b0: 64 65 20 66 72 6f 6d 20 72 65 61 64 20 6f 70 65  de from read ope
c9c0: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c  rations */.  sql
c9d0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
c9e0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
c9f0: 73 63 72 69 70 74 6f 72 20 66 72 6f 6d 20 77 68  scriptor from wh
ca00: 69 63 68 20 77 65 20 61 72 65 20 72 65 61 64 69  ich we are readi
ca10: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
ca20: 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
ca30: 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  Content of the p
ca40: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  age */..  /* Rea
ca50: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
ca60: 72 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 66 64  r header */.  fd
ca70: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b 0a   = pPager->jfd;.
ca80: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
ca90: 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  s(fd, pPager->jo
caa0: 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e 6f 29  urnalOff, &pgno)
cab0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
cac0: 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20  TE_OK ){ return 
cad0: 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0; }            
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
cb00: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
cb10: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
cb20: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
cb30: 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20  { return 0; }   
cb40: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
cb50: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  /.  if( pgno>(Pg
cb60: 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
cb70: 65 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  e ){ return 0; }
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
cba0: 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
cbb0: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72   checksum */.  r
cbc0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66  c = read32bits(f
cbd0: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
cbe0: 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61  alOff+pPager->pa
cbf0: 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d  geSize+4, &cksum
cc00: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
cc10: 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e  ITE_OK ){ return
cc20: 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20   0; }           
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
cc50: 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
cc60: 65 20 64 61 74 61 20 61 6e 64 20 76 65 72 69 66  e data and verif
cc70: 79 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a  y the checksum *
cc80: 2f 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38 2a  /.  aData = (u8*
cc90: 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
cca0: 63 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ce;.  rc = sqlit
ccb0: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 44 61  e3OsRead(fd, aDa
ccc0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
ccd0: 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  Size, pPager->jo
cce0: 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20 20 69  urnalOff+4);.  i
ccf0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cd00: 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69   /*NO_TEST*/.  i
cd40: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
cd50: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
cd60: 6b 73 75 6d 20 29 7b 20 72 65 74 75 72 6e 20 30  ksum ){ return 0
cd70: 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
cd80: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20   /*NO_TEST*/..  
cd90: 2f 2a 20 52 65 61 63 68 20 74 68 69 73 20 70 6f  /* Reach this po
cda0: 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  int only if the 
cdb0: 70 61 67 65 20 69 73 20 76 61 6c 69 64 20 2a 2f  page is valid */
cdc0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
cdd0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
cde0: 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
cdf0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
ce00: 52 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 2f  RAGE_TEST) */../
ce10: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
ce20: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
ce30: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
ce40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
ce50: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
ce60: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
ce70: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
ce80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
ce90: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
cea0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
ceb0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
cec0: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
ced0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
cee0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cef0: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
cf00: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
cf10: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
cf20: 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
cf30: 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
cf40: 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
cf50: 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
cf60: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
cf70: 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
cf80: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  tion..**.**.** T
cf90: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cfa0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
cfb0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
cfc0: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
cfd0: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
cfe0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cff0: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
d000: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
d010: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
d020: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
d030: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
d040: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
d050: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
d060: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
d070: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
d080: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
d090: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
d0a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
d0b0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
d0c0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
d0d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
d0e0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
d0f0: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
d100: 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
d110: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
d120: 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  pen = 0;.  sqlit
d130: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
d140: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
d150: 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68   *pJournal;.  ch
d160: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
d170: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
d180: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
d190: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
d1a0: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
d1b0: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
d1c0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
d1d0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
d1e0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
d1f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
d200: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
d210: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
d220: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
d230: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
d240: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
d250: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
d260: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
d270: 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
d280: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
d290: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70  )sqlite3Malloc(p
d2a0: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
d2b0: 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
d2c0: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
d2d0: 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
d2e0: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
d2f0: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
d300: 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
d310: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d320: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66  }else{.    int f
d330: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
d340: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
d350: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
d360: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
d370: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
d380: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
d390: 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
d3a0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
d3b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
d3c0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
d3d0: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
d3e0: 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 1;..  rc = sql
d3f0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d400: 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
d410: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
d420: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d430: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
d440: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
d450: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
d460: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
d470: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
d480: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
d490: 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
d4a0: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
d4b0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
d4c0: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
d4d0: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
d4e0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
d4f0: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
d500: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
d510: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
d520: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
d530: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
d540: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
d550: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
d560: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
d570: 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
d580: 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
d590: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
d5a0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
d5b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d5c0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
d5d0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
d5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
d5f0: 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
d600: 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
d610: 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
d620: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d630: 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
d640: 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
d650: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
d660: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d670: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
d680: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
d690: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
d6a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
d6b0: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
d6c0: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
d6d0: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
d6e0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  l ){.      int e
d6f0: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20  xists;.      rc 
d700: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
d710: 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
d720: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
d730: 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
d740: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d750: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d760: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
d770: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
d780: 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74  .      if( exist
d790: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
d7a0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
d7b0: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
d7c0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
d7d0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
d7e0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
d7f0: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
d800: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
d810: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
d820: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
d830: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
d840: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
d850: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
d860: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d870: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
d880: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
d890: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
d8a0: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
d8b0: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
d8c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d8d0: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
d8e0: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
d8f0: 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
d900: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
d910: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d920: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
d930: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
d940: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
d950: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
d960: 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
d970: 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
d980: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
d990: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
d9a0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
d9b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d9c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
d9d0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
d9e0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
d9f0: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
da00: 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
da10: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
da20: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
da30: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
da40: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
da50: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
da60: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
da70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
da80: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
da90: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
daa0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
dab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
dac0: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
dad0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
dae0: 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
daf0: 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
db00: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
db10: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
db20: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
db30: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
db40: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
db50: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
db60: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
db70: 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70  .  if( master_op
db80: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
db90: 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
dba0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
dbb0: 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
dbc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dbd0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  ./*.** If the ma
dbe0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
dbf0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 6e 20   is open and an 
dc00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
dc10: 73 20 68 65 6c 64 2c 20 0a 2a 2a 20 74 72 75 6e  s held, .** trun
dc20: 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69  cate the main fi
dc30: 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  le of the given 
dc40: 70 61 67 65 72 20 74 6f 20 74 68 65 20 73 70 65  pager to the spe
dc50: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 0a 2a  cified number .*
dc60: 2a 20 6f 66 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  * of pages..**.*
dc70: 2a 20 49 74 20 6d 69 67 68 74 20 6d 69 67 68 74  * It might might
dc80: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
dc90: 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
dca0: 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
dcb0: 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69  an nPage..** Thi
dcc0: 73 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f  s can happen, fo
dcd0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 77 65  r example, if we
dce0: 20 61 72 65 20 69 6e 20 74 68 65 20 6d 69 64 64   are in the midd
dcf0: 6c 65 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  le of a transact
dd00: 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 68 61 73  ion.** which has
dd10: 20 65 78 74 65 6e 64 65 64 20 74 68 65 20 66 69   extended the fi
dd20: 6c 65 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  le size and the 
dd30: 6e 65 77 20 70 61 67 65 73 20 61 72 65 20 73 74  new pages are st
dd40: 69 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20  ill all held.** 
dd50: 69 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 20 61  in cache, then a
dd60: 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41  n INSERT or UPDA
dd70: 54 45 20 64 6f 65 73 20 61 20 73 74 61 74 65 6d  TE does a statem
dd80: 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53  ent rollback.  S
dd90: 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ome.** operating
dda0: 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
ddb0: 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
ddc0: 63 6f 6e 66 75 73 65 64 20 69 66 20 79 6f 75 20  confused if you 
ddd0: 74 72 79 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61  try to.** trunca
dde0: 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
ddf0: 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
de00: 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 63 75  arger than it cu
de10: 72 72 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73  rrently is,.** s
de20: 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
de30: 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
de40: 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
de50: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
de60: 65 20 6e 65 77 0a 2a 2a 20 66 69 6c 65 20 69 6e  e new.** file in
de70: 73 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  stead..*/.static
de80: 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
de90: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
dea0: 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
deb0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dec0: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
ded0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
dee0: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 70 50  _EXCLUSIVE && pP
def0: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
df00: 64 73 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  ds ){.    i64 cu
df10: 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
df20: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
df30: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
df40: 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
df50: 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
df60: 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  wSize = pPager->
df70: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
df80: 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
df90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
dfa0: 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
dfb0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
dfc0: 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
dfd0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
dfe0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
dff0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
e000: 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
e010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
e030: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
e040: 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d   "", 1, newSize-
e050: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
e060: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e070: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
e080: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
e090: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
e0a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
e0b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e0c0: 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f  ** Set the secto
e0d0: 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69  rSize for the gi
e0e0: 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  ven pager..**.**
e0f0: 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
e100: 20 69 73 20 61 74 20 6c 65 61 73 74 20 61 73 20   is at least as 
e110: 62 69 67 20 61 73 20 74 68 65 20 73 65 63 74 6f  big as the secto
e120: 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a  r size reported.
e130: 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ** by sqlite3OsS
e140: 65 63 74 6f 72 53 69 7a 65 28 29 2e 20 54 68 65  ectorSize(). The
e150: 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20   minimum sector 
e160: 73 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a  size is 512..*/.
e170: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
e180: 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
e190: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
e1a0: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
e1b0: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
e1c0: 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
e1d0: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
e1e0: 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  ile ){.    /* Se
e1f0: 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
e200: 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
e210: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
e220: 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
e230: 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
e240: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
e250: 2c 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20  , in whcih case 
e260: 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
e270: 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
e280: 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20  ill segfault..  
e290: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
e2a0: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
e2b0: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
e2c0: 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
e2d0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
e2e0: 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20  >sectorSize<512 
e2f0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
e300: 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
e310: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
e320: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41  r->sectorSize>MA
e330: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
e340: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
e350: 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
e360: 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
e370: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
e380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
e390: 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
e3a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e3b0: 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
e3c0: 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
e3d0: 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
e3e0: 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
e3f0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
e400: 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
e410: 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
e420: 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
e430: 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
e440: 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
e450: 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
e460: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
e470: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
e480: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
e490: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
e4a0: 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
e4b0: 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
e4c0: 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
e4d0: 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
e4e0: 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
e4f0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
e500: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
e510: 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
e520: 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
e530: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
e540: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
e550: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
e560: 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
e570: 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
e580: 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
e590: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
e5a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
e5b0: 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
e5c0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
e5d0: 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
e5e0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
e5f0: 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
e600: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
e610: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
e620: 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
e630: 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
e640: 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
e650: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
e660: 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
e670: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
e680: 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
e690: 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34  case..**  (7)  4
e6a0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
e6b0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
e6c0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
e6d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e6e0: 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
e6f0: 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
e700: 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
e710: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
e720: 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
e730: 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
e740: 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (8)  N bytes of 
e750: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e760: 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
e770: 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
e780: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
e790: 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
e7a0: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
e7b0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
e7c0: 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
e7d0: 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
e7e0: 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
e7f0: 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
e800: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
e810: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
e820: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
e830: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
e840: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
e850: 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (9)  Zero or mo
e860: 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
e870: 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
e880: 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
e890: 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
e8a0: 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
e8b0: 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
e8c0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
e8d0: 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
e8e0: 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
e8f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
e900: 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
e910: 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
e920: 61 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 69  an the first 8 i
e930: 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
e940: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
e950: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
e960: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 39  nstance of the 9
e970: 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
e980: 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
e990: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
e9a0: 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
e9b0: 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
e9c0: 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
e9d0: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
e9e0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
e9f0: 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
ea00: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
ea10: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
ea20: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
ea30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ea40: 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
ea50: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
ea60: 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
ea70: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
ea80: 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
ea90: 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
eaa0: 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
eab0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
eac0: 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
ead0: 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
eae0: 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
eaf0: 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
eb00: 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
eb10: 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
eb20: 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
eb30: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
eb40: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
eb50: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
eb60: 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
eb70: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
eb80: 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
eb90: 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
eba0: 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
ebb0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
ebc0: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
ebd0: 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
ebe0: 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
ebf0: 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
ec00: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
ec10: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
ec20: 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
ec30: 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
ec40: 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
ec50: 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
ec60: 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
ec70: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
ec80: 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
ec90: 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
eca0: 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
ecb0: 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
ecc0: 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
ecd0: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
ece0: 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
ecf0: 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
ed00: 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
ed10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
ed20: 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
ed30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
ed40: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
ed50: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
ed60: 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
ed70: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
ed80: 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
ed90: 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
eda0: 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
edb0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
edc0: 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
edd0: 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
ede0: 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
edf0: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
ee00: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
ee10: 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
ee20: 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
ee30: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
ee40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
ee50: 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
ee60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
ee70: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
ee80: 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
ee90: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
eea0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
eeb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
eec0: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
eed0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
eee0: 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
eef0: 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
ef00: 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
ef10: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
ef20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
ef30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ef40: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
ef50: 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
ef60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ef70: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
ef80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
ef90: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
efa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
efb0: 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
efc0: 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
efd0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
efe0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
eff0: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
f000: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
f010: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
f020: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
f030: 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
f040: 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
f050: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
f060: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
f070: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
f080: 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
f090: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
f0a0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
f0b0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
f0c0: 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
f0d0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
f0e0: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
f0f0: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
f100: 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
f110: 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
f120: 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
f130: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
f140: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f150: 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
f160: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
f170: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
f180: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
f190: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
f1a0: 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
f1b0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
f1c0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
f1d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
f1e0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
f1f0: 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
f200: 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
f210: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f220: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
f230: 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
f240: 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
f250: 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
f260: 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
f270: 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
f280: 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
f290: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
f2a0: 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a  d back..  */.  z
f2b0: 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
f2c0: 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
f2d0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
f2e0: 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
f2f0: 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
f300: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
f310: 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
f320: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
f330: 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
f340: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
f350: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
f360: 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
f370: 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
f380: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
f390: 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
f3a0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
f3b0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
f3c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
f3d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f3e0: 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  Off = 0;..  /* T
f3f0: 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
f400: 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
f410: 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  the readJournalH
f420: 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  dr() call return
f430: 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  s.  ** SQLITE_DO
f440: 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
f450: 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77  r occurs. */.  w
f460: 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
f470: 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
f480: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f490: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
f4a0: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
f4b0: 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
f4c0: 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
f4d0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
f4e0: 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
f4f0: 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
f500: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
f510: 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
f520: 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
f530: 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
f540: 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
f550: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
f560: 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
f570: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
f580: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
f590: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
f5a0: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
f5b0: 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
f5c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f5d0: 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
f5e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
f5f0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
f600: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f610: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
f620: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
f630: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
f640: 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
f650: 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
f660: 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
f670: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
f680: 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
f690: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
f6a0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
f6b0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
f6c0: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
f6d0: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
f6e0: 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
f6f0: 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
f700: 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
f710: 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
f720: 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
f730: 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
f740: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
f750: 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
f760: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
f770: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
f780: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
f790: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
f7a0: 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
f7b0: 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
f7c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f7d0: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
f7e0: 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
f7f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
f800: 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
f810: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
f820: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
f830: 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
f840: 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
f850: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
f860: 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
f870: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
f880: 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
f890: 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
f8a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f8b0: 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
f8c0: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
f8d0: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
f8e0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
f8f0: 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
f900: 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
f910: 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
f920: 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
f930: 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
f940: 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
f950: 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
f960: 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
f970: 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
f980: 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
f990: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
f9a0: 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
f9b0: 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
f9c0: 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
f9d0: 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
f9e0: 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
f9f0: 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
fa00: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
fa10: 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
fa20: 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
fa30: 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
fa40: 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
fa50: 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
fa60: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
fa70: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
fa80: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
fa90: 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
faa0: 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
fab0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
fac0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
fad0: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
fae0: 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
faf0: 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
fb00: 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
fb10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
fb20: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
fb30: 74 65 73 74 63 61 73 65 28 20 6e 52 65 63 3d 3d  testcase( nRec==
fb40: 30 20 26 26 20 21 69 73 48 6f 74 0a 20 20 20 20  0 && !isHot.    
fb50: 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
fb60: 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
fb70: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
fb80: 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )!=pPager->journ
fb90: 61 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26  alOff.         &
fba0: 26 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  & ((szJ - pPager
fbb0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
fbc0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
fbd0: 61 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20  ager))>0.       
fbe0: 20 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f    && pagerNextJo
fbf0: 75 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64  urnalPageIsValid
fc00: 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a  (pPager).    );.
fc10: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
fc20: 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
fc30: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
fc40: 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
fc50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
fc60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fc70: 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
fc80: 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
fc90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fca0: 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
fcb0: 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
fcc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
fcd0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
fce0: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
fcf0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
fd00: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
fd10: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
fd20: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
fd30: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
fd40: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
fd50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
fd60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
fd70: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
fd80: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
fd90: 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
fda0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
fdb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fdc0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
fdd0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
fde0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
fdf0: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
fe00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
fe10: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
fe20: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
fe30: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
fe40: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
fe50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
fe60: 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
fe70: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
fe80: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
fe90: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
fea0: 31 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1, &pPager->jour
feb0: 6e 61 6c 4f 66 66 2c 20 30 2c 20 30 29 3b 0a 20  nalOff, 0, 0);. 
fec0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
fed0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fee0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fef0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
ff00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
ff10: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
ff20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ff30: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
ff40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ff50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ff60: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
ff70: 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
ff80: 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
ff90: 61 73 65 20 69 73 20 70 72 6f 62 61 62 6c 79 0a  ase is probably.
ffa0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67 6f 69            ** goi
ffb0: 6e 67 20 74 6f 20 65 6e 64 20 75 70 20 62 65 69  ng to end up bei
ffc0: 6e 67 20 63 6f 72 72 75 70 74 2e 20 20 49 74 20  ng corrupt.  It 
ffd0: 69 73 20 63 6f 72 72 75 70 74 20 74 6f 20 75 73  is corrupt to us
ffe0: 2c 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20 20  , anyhow..      
fff0: 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74      ** Perhaps t
10000 68 65 20 6e 65 78 74 20 70 72 6f 63 65 73 73 20  he next process 
10010 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63 61  to come along ca
10020 6e 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20 20  n fix it.....   
10030 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10040 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10050 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
10060 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
10070 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
10080 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10090 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
100a0 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
100b0 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
100c0 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
100d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
100e0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
100f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
10100 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
10110 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
10120 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
10130 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
10140 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a  athname+1);.  }.
10150 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10160 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
10170 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
10180 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
10190 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
101a0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
101b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
101c0 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
101d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
101e0 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
101f0 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
10200 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
10210 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
10220 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
10230 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
10240 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
10250 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
10260 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
10270 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
10280 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  Master);.  }..  
10290 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
102a0 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
102b0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
102c0 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
102d0 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
102e0 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
102f0 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
10300 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
10310 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
10320 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
10330 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
10340 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
10350 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
10360 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
10370 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
10390 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
103a0 61 76 65 70 6f 69 6e 74 2e 20 20 4f 72 2c 20 69  avepoint.  Or, i
103b0 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
103c0 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
103d0 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
103e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
103f0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ile..**.** The c
10400 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
10410 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
10420 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63   a ROLLBACK TO c
10430 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65  ommand is invoke
10440 64 0a 2a 2a 20 6f 6e 20 61 20 53 41 56 45 50 4f  d.** on a SAVEPO
10450 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
10460 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
10470 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
10480 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
10490 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
104a0 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
104b0 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
104c0 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
104f0 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
10500 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
10510 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
10520 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
10530 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
10540 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
10550 6f 72 64 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ords */.  Pgno i
10560 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
10570 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10580 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
10590 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
105a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
105b0 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
105c0 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
105d0 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
105e0 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
105f0 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
10600 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
10610 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20  a bitvec to use 
10620 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
10630 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64   of pages rolled
10640 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   back */.  if( p
10650 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
10660 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33   pDone = sqlite3
10670 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61  BitvecCreate(pSa
10680 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b  vepoint->nOrig);
10690 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20  .    if( !pDone 
106a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
106b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
106c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72    }.  }..  /* Tr
106d0 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
106e0 61 73 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ase back to the 
106f0 73 69 7a 65 20 69 74 20 77 61 73 20 62 65 66 6f  size it was befo
10700 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 61 76  re the .  ** sav
10710 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 72 65 76  epoint being rev
10720 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
10730 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
10740 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
10750 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
10760 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
10770 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
10780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10790 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
107a0 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 55 73  ARED );..  /* Us
107b0 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
107c0 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
107d0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
107e0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
107f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
10800 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
10810 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
10820 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
10830 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
10840 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
10850 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10860 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
10870 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
10880 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
10890 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
108a0 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
108b0 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
108c0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
108d0 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
108e0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
108f0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
10900 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
10910 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
10920 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
10930 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
10940 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
10950 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
10960 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
10970 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
10980 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
10990 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
109a0 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
109b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
109c0 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
109d0 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
109e0 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
109f0 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
10a00 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
10a10 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
10a20 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
10a30 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
10a40 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
10a50 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
10a60 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
10a70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
10a80 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
10a90 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
10aa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10ab0 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
10ac0 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
10ad0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
10ae0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
10af0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
10b00 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
10b10 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
10b20 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
10b30 65 72 2c 20 31 2c 20 26 70 50 61 67 65 72 2d 3e  er, 1, &pPager->
10b40 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70  journalOff, 1, p
10b50 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Done);.      ass
10b60 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
10b70 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  DONE );.    }.  
10b80 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
10b90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10ba0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
10bb0 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
10bc0 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
10bd0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
10be0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
10bf0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
10c00 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
10c10 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
10c20 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
10c30 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
10c40 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
10c50 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
10c60 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
10c70 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
10c80 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
10c90 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
10ca0 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
10cb0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
10cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10cd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10ce0 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
10cf0 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
10d00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
10d10 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
10d20 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
10d30 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
10d40 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
10d50 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
10d60 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
10d70 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
10d80 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
10d90 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
10da0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
10db0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10dc0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
10dd0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
10de0 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
10df0 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
10e00 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
10e10 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
10e20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
10e30 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
10e40 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
10e50 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
10e60 20 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a      assert( !(nJ
10e70 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  Rec==0.         
10e80 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
10e90 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
10ea0 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50  R_SZ(pPager)!=pP
10eb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10ec0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73  .         && ((s
10ed0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
10ee0 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
10ef0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
10f00 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  )>0.         && 
10f10 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
10f20 50 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67  PageIsValid(pPag
10f30 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  er)).    );.    
10f40 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
10f50 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
10f60 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
10f70 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
10f80 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
10f90 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
10fa0 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20   nJRec = (szJ - 
10fb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10fc0 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
10fd0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
10fe0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
10ff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11000 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
11010 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
11020 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
11030 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
11040 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
11050 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 72  ager, 1, &pPager
11060 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c  ->journalOff, 1,
11070 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61   pDone);.      a
11080 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11090 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a  E_DONE );.    }.
110a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
110b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
110c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
110d0 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f==szJ );..  /* 
110e0 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
110f0 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
11100 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
11110 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
11120 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
11130 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
11140 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
11150 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
11160 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
11170 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
11180 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
11190 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
111a0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
111b0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
111c0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
111d0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  = pSavepoint->iS
111e0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
111f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
11200 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e  for(ii=pSavepoin
11210 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d  t->iSubRec; rc==
11220 53 51 4c 49 54 45 5f 4f 4b 26 26 69 69 3c 28 75  SQLITE_OK&&ii<(u
11230 33 32 29 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e  32)pPager->stmtN
11240 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
11250 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
11260 20 3d 3d 20 69 69 2a 28 34 2b 70 50 61 67 65 72   == ii*(4+pPager
11270 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20  ->pageSize) );. 
11280 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11290 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
112a0 65 28 70 50 61 67 65 72 2c 20 30 2c 20 26 6f 66  e(pPager, 0, &of
112b0 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b  fset, 1, pDone);
112c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
112d0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
112e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
112f0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11300 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
11310 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11320 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
11330 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
11340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
11360 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
11370 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
11380 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
11390 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
113a0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
113b0 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
113c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
113d0 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
113e0 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
113f0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
11400 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
11410 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
11420 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
11430 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
11440 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
11450 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
11460 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
11470 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
11480 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
11490 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
114a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
114b0 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
114c0 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
114d0 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
114e0 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
114f0 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
11500 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
11510 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
11520 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
11530 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
11540 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
11550 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
11560 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
11570 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
11580 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
11590 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
115a0 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
115b0 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
115c0 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
115d0 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
115e0 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
115f0 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
11600 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
11610 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
11630 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
11640 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
11650 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
11660 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
11670 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
11680 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
11690 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
116a0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
116b0 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
116c0 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
116d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
116e0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
116f0 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
11700 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
11710 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
11720 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
11730 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
11740 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
11750 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
11760 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
11770 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
11780 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
11790 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
117a0 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
117b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
117c0 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
117d0 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
117e0 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
117f0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
11800 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
11810 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
11820 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
11830 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
11840 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
11850 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
11860 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
11870 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
11880 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
11890 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
118a0 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
118b0 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
118c0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
118d0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
118e0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
118f0 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
11900 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
11910 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
11920 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
11930 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
11940 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
11950 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
11960 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
11970 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e  l, int bFullFsyn
11980 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
11990 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d  Sync =  (level==
119a0 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
119b0 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
119c0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
119d0 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21  = (level==3 && !
119e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
119f0 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
11a00 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28  ->sync_flags = (
11a10 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54  bFullFsync?SQLIT
11a20 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49  E_SYNC_FULL:SQLI
11a30 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
11a40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
11a50 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
11a60 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
11a70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
11a80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
11a90 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
11aa0 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
11ab0 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
11ac0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
11ad0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
11ae0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
11af0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
11b00 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
11b10 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
11b20 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
11b30 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
11b40 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
11b50 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
11b60 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
11b70 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a  emporary file. .
11b80 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
11b90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11ba0 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
11bb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
11bc0 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
11bd0 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
11be0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
11bf0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
11c00 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
11c10 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  the temporary.**
11c20 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
11c30 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
11c40 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61  ic int sqlite3Pa
11c50 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
11c60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
11c70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
11c80 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
11c90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
11ca0 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
11cb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11cc0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
11cd0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
11ce0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
11cf0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
11d00 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
11d10 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  rc;..#ifdef SQLI
11d20 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
11d30 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
11d40 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
11d50 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
11d60 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
11d70 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
11d80 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
11d90 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
11da0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
11db0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
11dc0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
11dd0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
11de0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
11df0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
11e00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
11e10 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
11e20 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
11e30 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
11e40 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d  _OK || pFile->pM
11e50 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74 75  ethods );.  retu
11e60 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
11e70 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
11e80 28 76 6f 69 64 20 2a 2c 50 67 48 64 72 20 2a 29  (void *,PgHdr *)
11e90 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
11ea0 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65  a new page cache
11eb0 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
11ec0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63  er to the page c
11ed0 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72  ache in *ppPager
11ee0 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f  ..** The file to
11ef0 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20   be cached need 
11f00 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
11f10 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  file is not lock
11f20 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ed until.** the 
11f30 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
11f40 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
11f50 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
11f60 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
11f70 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
11f80 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
11f90 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
11fa0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ()..**.** If zFi
11fb0 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
11fc0 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
11fd0 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
11fe0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
11ff0 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
12000 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
12010 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77  hed.  The file w
12020 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  ill be deleted.*
12030 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
12040 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
12050 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
12060 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
12070 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66  y:" then all inf
12080 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
12090 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74   in cache..** It
120a0 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
120b0 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73  n to disk.  This
120c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
120d0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20  implement an.** 
120e0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
120f0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
12100 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
12110 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12120 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
12130 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
12140 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
12150 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
12160 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
12170 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
12180 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
12190 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
121a0 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
121b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
121c0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
121d0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
121e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
121f0 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
12200 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
12210 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
12220 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
12230 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
12240 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
12250 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
12260 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
12270 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
12280 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
12290 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
122a0 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  () */.){.  u8 *p
122b0 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
122c0 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ager = 0;.  int 
122d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
122e0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
122f0 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
12300 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
12310 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
12320 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
12330 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
12340 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
12350 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
12360 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
12370 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
12380 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a  OCK)!=0;.  int j
12390 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 0a  ournalFileSize;.
123a0 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
123b0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
123c0 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20 73 7a  Size();.  int sz
123d0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
123e0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
123f0 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  IZE;.  char *zPa
12400 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  thname = 0;.  in
12410 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
12420 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  ..  if( sqlite3J
12430 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
12440 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
12450 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
12460 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
12470 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
12480 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 7d 65  Size(pVfs);.  }e
12490 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
124a0 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  FileSize = sqlit
124b0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
124c0 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ();.  }..  /* Th
124d0 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e  e default return
124e0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
124f0 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  er */.  *ppPager
12500 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
12510 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
12520 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
12530 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
12540 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
12550 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
12560 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
12570 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
12580 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
12590 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
125a0 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
125b0 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
125c0 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
125d0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
125e0 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
125f0 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  {.    nPathname 
12600 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
12610 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
12620 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
12630 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
12640 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
12650 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
12660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12670 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  MEM;.    }.#ifnd
12680 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
12690 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
126a0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
126b0 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
126c0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
126d0 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
126e0 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
126f0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
12700 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
12710 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
12720 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
12730 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
12740 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
12750 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
12760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12770 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
12780 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
12790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
127a0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
127b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
127c0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d  (zPathname);.  }
127d0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
127e0 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70  memory for the p
127f0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
12800 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  /.  pPager = sql
12810 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
12820 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67      sizeof(*pPag
12830 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  er) +           
12840 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
12850 72 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68 65  re */.    pcache
12860 53 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20 20  Size      +     
12870 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20        /* PCache 
12880 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a 6f  object */.    jo
12890 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20  urnalFileSize + 
128a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
128b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
128c0 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20  ructure */ .    
128d0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 20  pVfs->szOsFile  
128e0 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  +           /* T
128f0 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
12900 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
12910 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
12920 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
12930 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
12940 20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20      3*nPathname 
12950 2b 20 34 30 20 20 20 20 20 20 20 20 20 20 20 20  + 40            
12960 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44  /* zFilename, zD
12970 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e  irectory, zJourn
12980 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  al */.  );.  if(
12990 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20   !pPager ){.    
129a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
129b0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
129c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
129d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
129e0 70 50 43 61 63 68 65 20 3d 20 28 50 43 61 63 68  pPCache = (PCach
129f0 65 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  e *)&pPager[1];.
12a00 20 20 70 50 74 72 20 3d 20 28 28 75 38 20 2a 29    pPtr = ((u8 *)
12a10 26 70 50 61 67 65 72 5b 31 5d 29 20 2b 20 70 63  &pPager[1]) + pc
12a20 61 63 68 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  acheSize;.  pPag
12a30 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
12a40 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65  fsFlags;.  pPage
12a50 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33  r->fd = (sqlite3
12a60 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
12a70 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a  s->szOsFile*0];.
12a80 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
12a90 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
12aa0 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
12ab0 46 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  File];.  pPager-
12ac0 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  >jfd = (sqlite3_
12ad0 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
12ae0 2d 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75 72 6e  ->szOsFile+journ
12af0 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  alFileSize];.  p
12b00 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
12b10 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b   = (char*)&pPtr[
12b20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 32  pVfs->szOsFile+2
12b30 2a 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  *journalFileSize
12b40 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
12b50 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
12b60 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
12b70 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61  thname+1];.  pPa
12b80 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
12b90 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
12ba0 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ory[nPathname+1]
12bb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  ;.  pPager->pVfs
12bc0 20 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20 7a   = pVfs;.  if( z
12bd0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
12be0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
12bf0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
12c00 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31  ame, nPathname+1
12c10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
12c20 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
12c30 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
12c40 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
12c50 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
12c60 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
12c70 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
12c80 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61  .    if( nPathna
12c90 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  me>(pVfs->mxPath
12ca0 6e 61 6d 65 20 2d 20 28 69 6e 74 29 73 69 7a 65  name - (int)size
12cb0 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20  of("-journal")) 
12cc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
12cd0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
12ce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12cf0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
12d00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12d10 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
12d20 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
12d30 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20  pPager->fd,.    
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73       pPager->vfs
12d60 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
12d70 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20       readOnly = 
12d80 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
12d90 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
12da0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
12db0 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
12dc0 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
12dd0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
12de0 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ,.      ** choos
12df0 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
12e00 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
12e10 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
12e20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
12e30 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
12e40 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
12e50 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
12e60 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   of:.      **.  
12e70 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
12e80 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
12e90 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20  SIZE,.      **  
12ea0 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
12eb0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
12ec0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
12ed0 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
12ee0 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
12ef0 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
12f00 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
12f10 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
12f20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12f30 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
12f40 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  y ){.        set
12f50 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
12f60 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
12f70 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
12f80 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
12f90 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
12fa0 65 44 66 6c 74 20 3d 20 70 50 61 67 65 72 2d 3e  eDflt = pPager->
12fb0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
12fc0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
12fd0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
12fe0 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
12ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
13000 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
13010 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
13020 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
13030 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
13040 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
13050 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
13060 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
13070 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
13080 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
13090 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
130a0 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
130b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
130c0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
130d0 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
130e0 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
130f0 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
13100 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
13110 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
13120 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
13130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
13140 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
13150 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
13160 29 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69  ) szPageDflt = i
13170 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
13180 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
13190 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61          if( szPa
131a0 67 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d 41  geDflt>SQLITE_MA
131b0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
131c0 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
131d0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
131e0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
131f0 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
13200 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13210 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
13220 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
13230 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
13240 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
13250 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
13260 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
13270 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
13280 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
13290 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
132a0 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
132b0 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
132c0 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
132d0 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
132e0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
132f0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
13300 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
13310 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
13320 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
13330 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
13340 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
13350 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
13360 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
13370 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
13380 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
13390 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
133a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
133b0 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
133c0 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
133d0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
133e0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
133f0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
13400 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
13410 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
13420 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
13430 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73  ite3PageMalloc(s
13440 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a  zPageDflt);.  }.
13450 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
13460 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
13470 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
13480 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72  s above..  ** Fr
13490 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  ee the Pager str
134a0 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
134b0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20   the file..  ** 
134c0 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20  Since the pager 
134d0 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  is not allocated
134e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
134f0 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61  d to set .  ** a
13500 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b  ny Pager.errMask
13510 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f   variables..  */
13520 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c  .  if( !pPager |
13530 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
13540 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  pace ){.    sqli
13550 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13560 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
13570 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
13580 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72  ;.    return ((r
13590 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51  c==SQLITE_OK)?SQ
135a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a  LITE_NOMEM:rc);.
135b0 20 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d 20 46    }.  nExtra = F
135c0 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
135d0 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
135e0 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
135f0 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
13600 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
13610 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
13620 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
13630 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
13640 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
13650 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
13660 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
13670 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
13680 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
13690 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
136a0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
136b0 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
136c0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
136d0 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46  lename))..  /* F
136e0 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69  ill in Pager.zDi
136f0 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d  rectory[] */.  m
13700 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  emcpy(pPager->zD
13710 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72  irectory, pPager
13720 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
13730 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72  thname+1);.  for
13740 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  (i=sqlite3Strlen
13750 33 30 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  30(pPager->zDire
13760 63 74 6f 72 79 29 3b 20 0a 20 20 20 20 20 20 69  ctory); .      i
13770 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
13780 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
13790 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
137a0 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
137b0 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
137c0 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   0;..  /* Fill i
137d0 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  n Pager.zJournal
137e0 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  [] */.  if( zPat
137f0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d  hname ){.    mem
13800 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
13810 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46  rnal, pPager->zF
13820 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
13830 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
13840 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
13850 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
13860 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20  journal", 9);.  
13870 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
13880 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  r->zJournal = 0;
13890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65  .  }..  /* pPage
138a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
138b0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
138c0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  >useJournal = (u
138d0 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  8)useJournal;.  
138e0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
138f0 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b  ck = (noReadlock
13900 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31   && readOnly) ?1
13910 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  :0;.  /* pPager-
13920 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
13930 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
13940 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
13950 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
13960 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
13970 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
13980 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
13990 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
139a0 20 3d 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20   = szPageDflt;. 
139b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
139c0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
139d0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
139e0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
139f0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
13a00 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
13a10 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20  >mxPage = 100;. 
13a20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
13a30 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
13a40 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
13a50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
13a60 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
13a70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13a80 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
13a90 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
13aa0 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
13ab0 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50  LOCK) );.  /* pP
13ac0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
13ad0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
13ae0 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74  tempFile = (u8)t
13af0 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
13b00 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
13b10 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
13b20 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
13b30 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
13b40 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
13b50 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
13b60 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
13b70 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
13b80 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
13b90 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13ba0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
13bb0 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   .  pPager->memD
13bc0 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
13bd0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
13be0 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
13bf0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
13c00 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
13c10 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
13c20 20 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70   = (pPager->temp
13c30 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
13c40 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  nal) ?1:0;.  pPa
13c50 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
13c60 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
13c70 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
13c80 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
13c90 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
13ca0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
13cb0 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
13cc0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
13cd0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
13ce0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
13cf0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
13d00 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74  r->nExtra = nExt
13d10 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
13d20 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
13d30 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
13d40 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
13d50 49 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61  IT;.  assert(pPa
13d60 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
13d70 73 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  s||tempFile);.  
13d80 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
13d90 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ager);.  if( mem
13da0 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
13db0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
13dc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13dd0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
13de0 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
13df0 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
13e00 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
13e10 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
13e20 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
13e30 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
13e40 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
13e50 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
13e60 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
13e70 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
13e80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13e90 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
13ea0 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
13eb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
13ec0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
13ed0 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
13ee0 65 72 2c 20 0a 20 20 69 6e 74 20 28 2a 78 42 75  er, .  int (*xBu
13ef0 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
13f00 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 73  *),.  void *pBus
13f10 79 48 61 6e 64 6c 65 72 41 72 67 0a 29 7b 20 20  yHandlerArg.){  
13f20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
13f30 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
13f40 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
13f50 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
13f60 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
13f70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Arg;.}../*.** Se
13f80 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
13f90 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
13fa0 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
13fb0 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
13fc0 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
13fd0 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
13fe0 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
13ff0 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
14000 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
14010 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
14020 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
14030 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
14040 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
14050 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
14060 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
14070 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
14080 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
14090 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
140a0 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
140b0 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
140c0 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74  e3PagerSetReinit
140d0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
140e0 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74  , void (*xReinit
140f0 29 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70  )(DbPage*)){.  p
14100 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
14110 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
14120 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
14130 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65  e size to *pPage
14140 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67  Size. If the sug
14150 67 65 73 74 20 6e 65 77 20 70 61 67 65 20 73 69  gest new page si
14160 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f  ze is.** inappro
14170 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
14180 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
14190 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
141a0 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65  that.** value be
141b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
141c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
141d0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
141e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31  ager *pPager, u1
141f0 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20  6 *pPageSize){. 
14200 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72   int rc = pPager
14210 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28  ->errCode;.  if(
14220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14230 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69  {.    u16 pageSi
14240 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
14250 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
14260 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
14270 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
14280 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
14290 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
142a0 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a  .    if( pageSiz
142b0 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70  e && pageSize!=p
142c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
142d0 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72  .     && (pPager
142e0 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
142f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
14300 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
14310 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
14320 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
14330 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
14340 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63   char *pNew = (c
14350 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
14360 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
14370 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
14380 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
14390 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
143a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
143b0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
143c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
143d0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
143e0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
143f0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
14400 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 73 65 74  ger->memDb ) set
14410 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
14420 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
14430 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
14440 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
14450 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14460 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
14470 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14480 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
14490 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
144a0 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
144b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
144c0 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75   *pPageSize = (u
144d0 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  16)pPager->pageS
144e0 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ize;.  }.  retur
144f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
14500 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
14510 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
14520 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
14530 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
14540 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
14550 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
14560 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
14570 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
14580 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
14590 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
145a0 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
145b0 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
145c0 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
145d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
145e0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
145f0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
14600 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
14610 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
14620 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
14630 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
14640 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
14650 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
14660 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
14670 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
14680 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
14690 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
146a0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
146b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
146c0 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
146d0 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
146e0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
146f0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
14700 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
14710 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
14720 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
14730 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
14740 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
14750 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
14760 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
14770 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
14780 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
14790 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
147a0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
147b0 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
147c0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
147d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
147e0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
147f0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
14800 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
14810 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
14820 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
14830 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  age;.  }.  sqlit
14840 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
14850 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72  (pPager, 0);.  r
14860 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
14870 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
14880 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
14890 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
148a0 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
148b0 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
148c0 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
148d0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
148e0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
148f0 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
14900 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
14910 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
14920 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
14930 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
14940 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
14950 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
14960 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
14970 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
14980 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
14990 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
149a0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
149b0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
149c0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
149d0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
149e0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
149f0 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
14a00 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
14a10 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
14a20 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
14a30 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
14a40 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
14a50 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
14a60 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
14a70 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
14a80 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
14a90 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
14aa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
14ab0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
14ac0 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
14ad0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
14ae0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
14af0 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
14b00 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
14b10 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
14b20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
14b30 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
14b40 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
14b50 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
14b60 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
14b70 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
14b80 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
14b90 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
14ba0 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72  g is done. The r
14bb0 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73  ational for this
14bc0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
14bd0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62  nction .** may b
14be0 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66  e called even if
14bf0 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
14c00 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
14c10 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e  ain a header. In
14c20 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73   .** these cases
14c30 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
14c40 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20   will return an 
14c50 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20  error, to which 
14c60 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20  the correct .** 
14c70 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a  response is to z
14c80 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ero the memory a
14c90 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74  t pDest and cont
14ca0 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f  inue.  A real IO
14cb0 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20   error .** will 
14cc0 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72  presumably recur
14cd0 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75   and be picked u
14ce0 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54  p later (Todo: T
14cf0 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29  hink about this)
14d00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14d10 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
14d20 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
14d30 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
14d40 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
14d50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14d60 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
14d70 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
14d80 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
14d90 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
14da0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
14db0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
14dc0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
14dd0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
14de0 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
14df0 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
14e00 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
14e10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
14e20 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69  st, N, 0);.    i
14e30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
14e40 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
14e50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
14e60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
14e70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
14e80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
14e90 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
14ea0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
14eb0 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
14ec0 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
14ed0 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ger. .**.** If t
14ee0 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  he PENDING_BYTE 
14ef0 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
14f00 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20   directly after 
14f10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
14f20 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e  * file, then con
14f30 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20  sider this page 
14f40 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
14f50 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c   too. For exampl
14f60 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47  e, if.** PENDING
14f70 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30  _BYTE is byte 40
14f80 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79  96 (the first by
14f90 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e  te of page 5) an
14fa0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
14fb0 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39  e.** file is 409
14fc0 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65  6 bytes, 5 is re
14fd0 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f  turned instead o
14fe0 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 4..*/.int sqli
14ff0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
15000 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
15010 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
15020 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   i64 n = 0;.  in
15030 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
15040 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
15050 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
15060 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
15070 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
15080 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15090 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
150a0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a  >dbSizeValid ){.
150b0 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
150c0 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
150d0 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50   {.    assert(pP
150e0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
150f0 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
15100 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28  File);.    if( (
15110 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
15120 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72  hods).     && (r
15130 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
15140 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
15150 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f  , &n))!=SQLITE_O
15160 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
15170 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
15180 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
15190 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
151a0 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
151b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
151c0 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
151d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
151e0 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /= pPager->pageS
151f0 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ize;.    }.    i
15200 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
15210 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
15220 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
15230 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 6e  dbSize = (Pgno)n
15240 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
15250 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 28 50 67  dbFileSize = (Pg
15260 6e 6f 29 6e 3b 0a 20 20 20 20 20 20 70 50 61 67  no)n;.      pPag
15270 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
15280 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
15290 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47   if( n==(PENDING
152a0 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
152b0 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e  geSize) ){.    n
152c0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  ++;.  }.  if( n>
152d0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
152e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
152f0 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a  Pgno = (Pgno)n;.
15300 20 20 7d 0a 20 20 69 66 28 20 70 6e 50 61 67 65    }.  if( pnPage
15310 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20   ){.    *pnPage 
15320 3d 20 28 69 6e 74 29 6e 3b 0a 20 20 7d 0a 20 20  = (int)n;.  }.  
15330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
15350 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
15360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
15370 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
15380 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  ;../*.** Try to 
15390 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
153a0 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
153b0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
153c0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
153d0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
153e0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
153f0 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
15400 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
15410 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
15420 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
15430 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
15440 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
15450 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
15460 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
15470 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
15480 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
15490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
154a0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
154b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
154c0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
154d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
154e0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
154f0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
15500 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
15510 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
15520 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
15530 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
15540 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
15550 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
15560 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
15570 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
15580 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
15590 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
155a0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
155b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
155c0 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
155d0 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
155e0 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
155f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15600 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
15610 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
15620 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  lid==0 );..  if(
15630 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15640 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
15650 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
15670 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15680 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
15690 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
156a0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
156b0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
156c0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
156d0 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
156e0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
156f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15710 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
15720 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
15730 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
15740 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
15750 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
15760 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15770 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
15780 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15790 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
157a0 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
157b0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
157c0 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
157d0 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
157e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
157f0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
15800 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
15810 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
15820 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
15830 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
15840 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
15850 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
15860 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
15870 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
15880 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
15890 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
158a0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76   committed..*/.v
158b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
158c0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
158d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
158e0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
158f0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
15900 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73  zeValid );.  ass
15910 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
15920 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
15930 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15940 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nPage;.}../*.**
15950 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
15960 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
15970 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
15980 61 67 65 20 69 6e 20 70 61 67 65 73 2e 20 54 68  age in pages. Th
15990 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  is.** function d
159a0 69 66 66 65 72 73 20 66 72 6f 6d 20 73 71 6c 69  iffers from sqli
159b0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
159c0 74 28 29 20 69 6e 20 74 77 6f 20 77 61 79 73 3a  t() in two ways:
159d0 0a 2a 2a 0a 2a 2a 20 20 61 29 20 49 74 20 6d 61  .**.**  a) It ma
159e0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
159f0 20 77 68 65 6e 20 61 74 20 6c 65 61 73 74 20 6f   when at least o
15a00 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
15a10 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  a database.**   
15a20 20 20 70 61 67 65 20 69 73 20 68 65 6c 64 2e 20    page is held. 
15a30 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
15a40 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
15a50 65 20 73 69 7a 65 20 69 73 20 61 6c 72 65 61 64  e size is alread
15a60 79 0a 2a 2a 20 20 20 20 20 6b 6e 6f 77 6e 20 61  y.**     known a
15a70 6e 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  nd a call to sql
15a80 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 29  ite3OsFileSize()
15a90 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
15aa0 2e 0a 2a 2a 0a 2a 2a 20 20 62 29 20 54 68 65 20  ..**.**  b) The 
15ab0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
15ac0 6e 6f 74 20 61 64 6a 75 73 74 65 64 20 66 6f 72  not adjusted for
15ad0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
15ae0 65 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  e..*/.Pgno sqlit
15af0 65 33 50 61 67 65 72 49 6d 61 67 65 53 69 7a 65  e3PagerImageSize
15b00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15b10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15b20 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
15b30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
15b40 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 23 65 6e  r->dbSize;.}.#en
15b50 64 69 66 20 20 2f 2a 20 69 66 6e 64 65 66 20 53  dif  /* ifndef S
15b60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
15b70 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
15b80 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
15b90 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
15ba0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
15bb0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
15bc0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
15bd0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
15be0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
15bf0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15c00 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
15c10 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
15c20 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
15c30 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
15c40 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
15c50 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
15c60 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
15c70 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
15c80 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
15c90 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
15ca0 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
15cb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
15cc0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
15cd0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
15ce0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
15cf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
15d00 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
15d10 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
15d20 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
15d30 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
15d40 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
15d50 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
15d60 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
15d70 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
15d80 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
15d90 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
15da0 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
15db0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
15dc0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
15dd0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
15de0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
15df0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
15e00 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
15e10 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
15e20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
15e30 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
15e40 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
15e50 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
15e60 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
15e70 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
15e80 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d  Pager);.  if( !M
15e90 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 53  EMDB ){.    /* S
15ea0 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  et Pager.journal
15eb0 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68  Hdr to -1 for th
15ec0 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65  e benefit of the
15ed0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
15ee0 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ) .    ** call w
15ef0 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65  hich may be made
15f00 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
15f10 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
15f20 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20  ack(). If it.   
15f30 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74   ** is not -1, t
15f40 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64  hen the unsynced
15f50 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f   portion of an o
15f60 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
15f70 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70   may.    ** be p
15f80 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
15f90 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
15fa0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
15fb0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20   occurs while.  
15fc0 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
15fd0 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
15fe0 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  base may become 
15ff0 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a  corrupt..    */.
16000 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16010 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20  nalHdr = -1;.   
16020 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
16030 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
16040 0a 20 20 7d 0a 20 20 65 6e 61 62 6c 65 5f 73 69  .  }.  enable_si
16050 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
16060 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e  s();.  sqlite3En
16070 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
16080 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
16090 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
160a0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
160b0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
160c0 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
160d0 29 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ).  if( pPager->
160e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
160f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
16100 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
16110 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74    }.  sqlite3Bit
16120 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
16130 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
16140 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
16150 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
16160 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b  AlwaysRollback);
16170 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
16180 65 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b 0a  epoint(pPager);.
16190 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
161a0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
161b0 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
161c0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
161d0 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
161e0 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
161f0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
16200 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44   **   sqlite3OsD
16210 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
16220 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
16230 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  .  */..  sqlite3
16240 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
16250 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
16260 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
16270 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
16280 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
16290 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
162a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
162b0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
162c0 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
162d0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
162e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
162f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
16300 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
16310 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
16320 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
16330 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
16340 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
16350 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
16360 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
16370 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
16380 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
16390 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
163a0 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
163b0 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
163c0 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
163d0 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
163e0 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
163f0 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
16400 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16410 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
16420 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
16430 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
16440 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
16450 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
16460 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
16470 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
16480 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
16490 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
164a0 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
164b0 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20  isk.  It is not 
164c0 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  safe to modify t
164d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
164e0 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
164f0 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75  after.** the jou
16500 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79  rnal has been sy
16510 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72  nced.  If the or
16520 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
16530 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f  is modified befo
16540 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  re.** the journa
16550 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20  l is synced and 
16560 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
16570 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79  occurs, the unsy
16580 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  nced journal.** 
16590 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f  data would be lo
165a0 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  st and we would 
165b0 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  be unable to com
165c0 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b  pletely rollback
165d0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
165e0 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62   changes.  Datab
165f0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
16600 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a  ould occur..** .
16610 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16620 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65  also updates the
16630 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
16640 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
16650 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65   journal..** (Se
16660 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68  e comments on th
16670 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
16680 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
16690 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
166a0 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68  ation.).** If th
166b0 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46  e sync mode is F
166c0 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77  ULL, two syncs w
166d0 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73  ill occur.  Firs
166e0 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  t the whole jour
166f0 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64  nal.** is synced
16700 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20  , then the nRec 
16710 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
16720 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20  , then a second 
16730 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
16740 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
16750 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64   databases, we d
16760 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65  o not care if we
16770 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
16780 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61  lback.** after a
16790 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
167a0 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72  so no sync occur
167b0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
167c0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
167d0 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
167e0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
167f0 6d 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a  media on which.*
16800 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
16810 73 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f  s stored, then O
16820 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
16830 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a   called on the j
16840 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
16850 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
16860 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
16870 64 20 69 73 20 74 6f 20 75 70 64 61 74 65 20 74  d is to update t
16880 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
16890 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
168a0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  header..**.** Th
168b0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
168c0 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  s the needSync f
168d0 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61  ield of every pa
168e0 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20  ge current held 
168f0 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  in.** memory..*/
16900 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
16910 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
16920 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
16930 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
16940 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
16950 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
16960 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
16970 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
16980 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
16990 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
169a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
169b0 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
169c0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
169d0 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
169e0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
169f0 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  le );.    if( pP
16a00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
16a10 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
16a20 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
16a30 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
16a40 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
16a50 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
16a60 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
16a70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16a80 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
16a90 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
16aa0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
16ab0 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
16ac0 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c          i64 jrnl
16ad0 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
16ae0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
16af0 20 20 20 20 20 20 20 20 75 38 20 7a 4d 61 67 69          u8 zMagi
16b00 63 5b 38 5d 3b 0a 0a 20 20 20 20 20 20 20 20 2f  c[8];..        /
16b10 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
16b20 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
16b30 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
16b40 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
16b50 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
16b60 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
16b70 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
16b80 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
16b90 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
16ba0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
16bb0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
16bc0 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
16bd0 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
16be0 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
16bf0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
16c00 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
16c10 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
16c20 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
16c30 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
16c40 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
16c50 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
16c60 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
16c70 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
16c80 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
16c90 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61  nnections transa
16ca0 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
16cb0 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
16cc0 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
16cd0 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
16ce0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
16cf0 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
16d00 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
16d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
16d20 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
16d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
16d40 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
16d50 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
16d60 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
16d70 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
16d80 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
16d90 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
16da0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
16db0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16dc0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
16dd0 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
16de0 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
16df0 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
16e00 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
16e10 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
16e20 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
16e30 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
16e40 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
16e50 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
16e60 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
16e70 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
16e80 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
16e90 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
16ea0 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
16eb0 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
16ec0 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
16ed0 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
16ee0 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
16ef0 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
16f00 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
16f10 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
16f20 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
16f30 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
16f40 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
16f50 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
16f60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16f70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16f80 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
16f90 2c 20 7a 4d 61 67 69 63 2c 20 38 2c 20 6a 72 6e  , zMagic, 8, jrn
16fa0 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  lOff);.        i
16fb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16fc0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4d   && 0==memcmp(zM
16fd0 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
16fe0 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
16ff0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
17000 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
17010 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
17020 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
17030 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
17040 65 72 6f 62 79 74 65 2c 20 31 2c 20 6a 72 6e 6c  erobyte, 1, jrnl
17050 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Off);.        }.
17060 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17070 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
17080 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
17090 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
170a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
170b0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
170c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
170d0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
170e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
170f0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
17100 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
17110 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
17120 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
17130 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
17140 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
17150 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
17160 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
17170 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
17180 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
17190 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
171a0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
171b0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
171c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
171d0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
171e0 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
171f0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
17200 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
17210 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
17220 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
17230 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
17240 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
17250 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
17260 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
17270 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
17280 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
17290 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
172a0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
172b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
172c0 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
172d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
172e0 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
172f0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
17300 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
17310 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
17320 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
17330 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
17340 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
17350 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
17360 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
17370 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
17380 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
17390 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
173a0 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
173b0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
173c0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
173d0 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
173e0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
173f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
17400 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
17410 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
17420 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
17430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
17440 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
17450 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17460 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
17470 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
17480 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
17490 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
174a0 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
174b0 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
174c0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
174d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
174e0 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
174f0 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
17500 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17520 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
17530 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
17540 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
17550 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
17560 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
17570 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
17580 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
17590 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
175a0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
175b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
175c0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
175d0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
175e0 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
175f0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
17600 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
17610 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
17620 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
17630 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
17640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
17650 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
17660 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
17670 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
17680 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
17690 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
176a0 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
176b0 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
176c0 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
176d0 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
176e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
176f0 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
17700 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
17710 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
17720 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
17730 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
17740 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
17750 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
17760 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
17770 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
17780 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
17790 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
177a0 66 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20 61  file. No calls a
177b0 72 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  re made.** to th
177c0 65 20 70 61 67 65 2d 63 61 63 68 65 20 74 6f 20  e page-cache to 
177d0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 73 20 61  mark the pages a
177e0 73 20 63 6c 65 61 6e 2e 20 49 74 20 69 73 20 74  s clean. It is t
177f0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
17800 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c  y.** of the call
17810 65 72 20 74 6f 20 75 73 65 20 50 63 61 63 68 65  er to use Pcache
17820 43 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50 63  CleanAll() or Pc
17830 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
17840 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20 70  to mark.** the p
17850 61 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  ages as clean..*
17860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17870 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
17880 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
17890 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
178a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
178b0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
178c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
178d0 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
178e0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
178f0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
17900 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
17910 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
17920 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
17930 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
17940 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
17950 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
17960 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
17970 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
17980 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
17990 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
179a0 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
179b0 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
179c0 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
179d0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
179e0 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
179f0 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
17a00 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
17a10 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
17a20 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
17a30 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
17a40 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
17a50 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
17a60 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
17a70 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
17a80 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
17a90 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
17aa0 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
17ab0 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
17ac0 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
17ad0 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
17ae0 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
17af0 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
17b00 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
17b10 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
17b20 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
17b30 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
17b40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
17b50 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
17b60 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
17b70 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
17b80 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
17b90 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
17ba0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
17bb0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
17bc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
17bd0 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
17be0 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
17bf0 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
17c00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17c10 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
17c20 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
17c30 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
17c40 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
17c50 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
17c60 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
17c70 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
17c80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
17c90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
17cb0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68  rn rc;.  }..  wh
17cc0 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20  ile( pList ){.. 
17cd0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
17ce0 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
17cf0 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
17d00 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69  it now. */.    i
17d10 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
17d20 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
17d30 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
17d40 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
17d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17d60 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
17d70 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
17d80 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
17d90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
17da0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
17db0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
17dc0 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
17dd0 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
17de0 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
17df0 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
17e00 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
17e10 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
17e20 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
17e30 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
17e40 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
17e50 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
17e60 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
17e70 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
17e80 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
17e90 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
17ea0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
17eb0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
17ec0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
17ed0 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
17ee0 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
17ef0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
17f00 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
17f10 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
17f20 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e  et = (pList->pgn
17f30 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
17f40 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
17f50 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20    char *pData = 
17f60 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
17f70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69  List->pData, pLi
17f80 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 0a 20  st->pgno, 6);.. 
17f90 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
17fa0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
17fb0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
17fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17fd0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
17fe0 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
17ff0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
18000 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
18010 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
18020 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
18030 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
18040 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
18050 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
18060 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
18070 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18080 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
18090 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
180a0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
180b0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
180c0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
180d0 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
180e0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
180f0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
18100 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
18110 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
18120 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
18130 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
18140 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
18150 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
18160 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
18170 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
18180 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
18190 69 7a 65 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  ize = pList->pgn
181a0 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
181b0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
181c0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
181d0 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
181e0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
181f0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
18200 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
18210 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ));.    }.#endif
18220 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
18230 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20  turn rc;.#ifdef 
18240 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
18250 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
18260 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
18270 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
18280 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
18290 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
182a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
182b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
182c0 0a 2a 2a 20 41 64 64 20 74 68 65 20 70 61 67 65  .** Add the page
182d0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
182e0 6e 61 6c 2e 20 49 74 20 69 73 20 74 68 65 20 63  nal. It is the c
182f0 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
18300 69 6c 69 74 79 20 74 6f 0a 2a 2a 20 75 73 65 20  ility to.** use 
18310 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
18320 28 29 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74  () to check that
18330 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
18340 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 0a 2a  quired before .*
18350 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
18360 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
18370 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
18380 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
18390 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  ){.  int rc;.  v
183a0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
183b0 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72  ->pData;.  Pager
183c0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
183d0 70 50 61 67 65 72 3b 0a 20 20 69 36 34 20 6f 66  pPager;.  i64 of
183e0 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  fset = pPager->s
183f0 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65  tmtNRec*(4+pPage
18400 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
18410 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43  char *pData2 = C
18420 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
18430 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
18440 37 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  7);..  PAGERTRAC
18450 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
18460 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
18470 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
18480 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20   pPg->pgno));.. 
18490 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
184a0 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
184b0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
184c0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
184d0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
184e0 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  s(pPager->sjfd, 
184f0 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
18500 6f 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  o);.  if( rc==SQ
18510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18520 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
18530 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
18540 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
18550 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
18560 74 2b 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  t+4);.  }.  if( 
18570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18580 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
18590 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  tNRec++;.    ass
185a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
185b0 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
185c0 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
185d0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
185e0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
185f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18600 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
18610 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
18620 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
18630 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
18640 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
18650 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
18660 69 6d 69 74 2e 20 54 68 65 20 61 72 67 75 6d 65  imit. The argume
18670 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
18680 74 6f 20 61 20 70 75 72 67 65 61 62 6c 65 20 50  to a purgeable P
18690 61 67 65 72 20 0a 2a 2a 20 6f 62 6a 65 63 74 2e  ager .** object.
186a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
186b0 74 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65 20  ttempts to make 
186c0 61 20 73 69 6e 67 6c 65 20 64 69 72 74 79 20 70  a single dirty p
186d0 61 67 65 20 74 68 61 74 20 68 61 73 20 6e 6f 0a  age that has no.
186e0 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ** outstanding r
186f0 65 66 65 72 65 6e 63 65 73 20 28 69 66 20 6f 6e  eferences (if on
18700 65 20 65 78 69 73 74 73 29 20 63 6c 65 61 6e 20  e exists) clean 
18710 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  so that it can b
18720 65 20 72 65 63 79 63 6c 65 64 20 0a 2a 2a 20 62  e recycled .** b
18730 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
18740 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
18750 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
18760 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
18770 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
18780 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
18790 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
187a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
187b0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
187c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
187d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
187e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
187f0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
18800 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
18810 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
18820 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
18830 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
18840 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
18850 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
18860 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
18870 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18880 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
18890 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20  fullSync && .   
188a0 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a       !(pPager->j
188b0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
188c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
188d0 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 20  MORY) &&.       
188e0 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69   !(sqlite3OsDevi
188f0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
18900 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
18910 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
18920 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b  APPEND).      ){
18930 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
18940 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
18950 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
18960 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
18970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18980 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
189a0 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
189b0 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
189c0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
189d0 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
189e0 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
189f0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
18a00 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
18a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18a30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18a40 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
18a50 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
18a60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18a70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18a80 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
18a90 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
18aa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
18ab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18ac0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
18ad0 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
18ae0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
18af0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
18b00 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
18b10 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
18b20 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  an(pPg);.  }.  r
18b30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
18b40 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
18b50 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
18b60 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
18b70 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
18b80 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
18b90 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
18ba0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
18bb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
18bc0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
18bd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18be0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
18bf0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
18c00 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
18c10 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
18c20 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
18c30 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
18c40 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
18c50 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
18c60 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
18c70 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  al..**.** Return
18c80 20 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e 61   negative if una
18c90 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
18ca0 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74   the status of t
18cb0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
18cc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
18cd0 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65  oes not open the
18ce0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
18cf0 20 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20   examine its.** 
18d00 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c  content.  Hence,
18d10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
18d20 68 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  ht contain the n
18d30 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a  ame of a master.
18d40 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
18d50 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 64 65  that has been de
18d60 6c 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65  leted, and hence
18d70 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72   not be hot.  Or
18d80 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f  .** the header o
18d90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  f the journal mi
18da0 67 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75  ght be zeroed ou
18db0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
18dc0 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73  .** does not dis
18dd0 63 6f 76 65 72 20 74 68 65 73 65 20 63 61 73 65  cover these case
18de0 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a  s of a non-hot j
18df0 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a  ournal - if the.
18e00 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
18e10 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
18e20 74 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75  t empty this rou
18e30 74 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a  tine assumes it.
18e40 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20  ** is hot.  The 
18e50 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
18e60 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
18e70 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a  scover that the.
18e80 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
18e90 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
18ea0 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70  t and will no-op
18eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18ec0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
18ed0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
18ee0 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
18ef0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18f00 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18f10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18f20 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73  E_OK;.  int exis
18f30 74 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6f  ts = 0;.  int lo
18f40 63 6b 65 64 20 3d 20 30 3b 0a 20 20 61 73 73 65  cked = 0;.  asse
18f50 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
18f60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18f70 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
18f80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18f90 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
18fa0 29 3b 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  );.  *pExists = 
18fb0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
18fc0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18fd0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
18fe0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
18ff0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
19000 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19010 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
19020 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19030 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
19040 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
19050 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d  d, &locked);.  }
19060 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19070 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26  E_OK && exists &
19080 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
19090 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20   int nPage;.    
190a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
190b0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
190c0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
190d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
190e0 4b 20 29 7b 0a 20 20 20 20 20 69 66 28 20 6e 50  K ){.     if( nP
190f0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
19100 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
19110 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
19120 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
19130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19140 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
19150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19160 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19170 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  }../*.** Read th
19180 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
19190 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
191a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
191b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
191c0 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a  adDbPage(Pager *
191d0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
191e0 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
191f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20    int rc;.  i64 
19200 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74  offset;.  assert
19210 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20  ( MEMDB==0 );.  
19220 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
19230 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
19240 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
19250 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
19260 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
19270 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19280 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
19290 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  D;.  }.  offset 
192a0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
192b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
192c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
192d0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
192e0 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
192f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
19300 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45   offset);.  PAGE
19310 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
19320 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
19330 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
19340 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
19350 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
19360 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
19370 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66  er, pgno));.  if
19380 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
19390 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
193a0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
193b0 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
193c0 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  24],.           
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72     sizeof(pPager
19400 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
19410 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
19420 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
19430 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
19440 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
19450 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
19460 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
19480 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
19490 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  Pg->pgno, pager_
194a0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
194b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
194c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
194d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
194e0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68  to obtain the sh
194f0 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72  ared lock requir
19500 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74  ed before.** dat
19510 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72  a may be read fr
19520 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
19530 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65  he. If the share
19540 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61  d lock has alrea
19550 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69  dy.** been obtai
19560 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
19570 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
19580 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79  *.** Immediately
19590 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
195a0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
195b0 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
195c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
195d0 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f   checks for a ho
195e0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  t-journal file. 
195f0 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  If one is found,
19600 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
19610 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72  llback.** is per
19620 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65  formed immediate
19630 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
19640 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  t pagerSharedLoc
19650 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
19660 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19670 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73  ITE_OK;.  int is
19680 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a  ErrorReset = 0;.
19690 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
196a0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
196b0 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
196c0 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75  ccess, has no ou
196d0 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
196e0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  page references 
196f0 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72  and is in an err
19700 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73  or-state, now is
19710 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63   the chance to c
19720 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72  lear.  ** the er
19730 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65  ror. Discard the
19740 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
19750 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
19760 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20   treat any.  ** 
19770 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
19780 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e as a hot-journ
19790 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  al..  */.  if( !
197a0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
197b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
197c0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
197d0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
197e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
197f0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
19800 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  de .  ){.    if(
19810 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19820 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73  Open ){.      is
19830 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a  ErrorReset = 1;.
19840 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
19850 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
19860 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
19870 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
19880 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
19890 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20   pager is still 
198a0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
198b0 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65  e, do not procee
198c0 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20  d. The error .  
198d0 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65  ** state will be
198e0 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65   cleared at some
198f0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
19900 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61  ture when all pa
19910 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  ge .  ** referen
19920 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20  ces are dropped 
19930 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61  and the cache ca
19940 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  n be discarded..
19950 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
19960 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
19970 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
19980 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
19990 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
199a0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
199b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
199c0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
199d0 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74   || isErrorReset
199e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
199f0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
19a00 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  er->pVfs;.    in
19a10 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  t isHotJournal =
19a20 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
19a30 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
19a40 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
19a50 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
19a60 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
19a70 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
19a80 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
19a90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
19aa0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
19ab0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
19ac0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
19ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19ae0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19af0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
19b00 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
19b10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
19b20 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
19b30 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  r, rc);.      }.
19b40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
19b50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
19b60 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
19b70 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
19b80 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
19b90 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19ba0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19bb0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
19bc0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
19bd0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
19be0 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
19bf0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
19c00 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
19c10 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
19c20 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
19c30 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
19c40 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
19c50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19c60 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b  !isErrorReset ){
19c70 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
19c80 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
19c90 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29  , &isHotJournal)
19ca0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19cc0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
19cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19ce0 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52      if( isErrorR
19cf0 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75  eset || isHotJou
19d00 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
19d10 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
19d20 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
19d30 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
19d40 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
19d50 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
19d60 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
19d70 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
19d80 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
19d90 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
19da0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
19db0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
19dc0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
19dd0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
19de0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
19df0 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
19e00 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
19e10 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
19e20 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
19e30 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
19e40 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
19e50 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
19e60 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
19e70 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a  .      ** back..
19e80 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
19e90 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
19ea0 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
19eb0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
19ec0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
19ed0 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
19ee0 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
19ef0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
19f00 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
19f10 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ail to.      ** 
19f20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45  obtain its own E
19f30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
19f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19f50 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
19f60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
19f70 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c  tate<EXCLUSIVE_L
19f80 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  OCK ){.        r
19f90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
19fa0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
19fb0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
19fc0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
19fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19fe0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
19ff0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1a000 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
1a010 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
1a020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
1a030 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1a040 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
1a050 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
1a060 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
1a070 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
1a080 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73   access. This is
1a090 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20   because in .   
1a0a0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
1a0b0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
1a0c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1a0d0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
1a0e0 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  n and.      ** p
1a0f0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
1a100 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
1a110 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
1a120 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
1a130 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
1a140 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
1a150 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1a160 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
1a170 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  ires.      ** a 
1a180 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20  read/write file 
1a190 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  handle..      */
1a1a0 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 45 72  .      if( !isEr
1a1b0 72 6f 72 52 65 73 65 74 20 26 26 20 70 50 61 67  rorReset && pPag
1a1c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1a1d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
1a1e0 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
1a1f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1a200 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d  ess(pVfs,pPager-
1a210 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45  >zJournal,SQLITE
1a220 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26  _ACCESS_EXISTS,&
1a230 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
1a240 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1a260 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
1a270 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
1a280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
1a290 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
1a2a0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1a2b0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1a2c0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
1a2d0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1a2e0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1a2f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1a300 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
1a310 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1a320 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
1a330 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
1a340 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1a350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a360 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  || pPager->jfd->
1a370 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20  pMethods );.    
1a380 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1a390 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
1a3a0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
1a3b0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
1a3c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1a3d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1a3f0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
1a400 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
1a410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a430 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1a440 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
1a450 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  xist, that means
1a460 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
1a470 65 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ess.            
1a480 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  ** has already r
1a490 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f  olled it back */
1a4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1a4b0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1a4c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a4d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a4e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a4f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a500 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
1a510 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1a520 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
1a530 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   1;.      pPager
1a540 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1a550 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
1a560 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1a570 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
1a580 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1a590 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
1a5a0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
1a5b0 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
1a5c0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
1a5d0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
1a5e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
1a5f0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
1a600 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
1a610 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
1a620 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
1a630 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
1a640 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
1a650 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
1a660 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
1a670 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
1a680 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
1a690 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  t cache..      *
1a6a0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  /.      sqlite3P
1a6b0 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
1a6c0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
1a6d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1a6e0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
1a6f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a710 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1a720 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1a730 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  c);.        goto
1a740 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
1a750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1a760 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1a770 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20  ER_SHARED || .  
1a780 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
1a790 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
1a7a0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
1a7b0 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
1a7c0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
1a7d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1a7e0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
1a7f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
1a800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1a810 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
1a820 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
1a830 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
1a840 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
1a850 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
1a860 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
1a870 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
1a880 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
1a890 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
1a8a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
1a8b0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1a8c0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1a8d0 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
1a8e0 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
1a8f0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
1a900 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68  hanged, flush th
1a910 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
1a920 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1a930 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
1a940 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64  nges is detected
1a950 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
1a960 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
1a970 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
1a980 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
1a990 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
1a9a0 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
1a9b0 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
1a9c0 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
1a9d0 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
1a9e0 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
1a9f0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
1aa00 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
1aa10 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
1aa20 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
1aa30 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
1aa40 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
1aa50 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
1aa60 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
1aa70 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
1aa80 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
1aa90 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
1aaa0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
1aab0 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
1aac0 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
1aad0 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
1aae0 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
1aaf0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
1ab00 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
1ab10 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1ab20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
1ab30 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
1ab40 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
1ab50 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1ab60 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1ab70 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66  r, 0);..      if
1ab80 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1ab90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
1aba0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1abb0 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e;.        goto 
1abc0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
1abd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1abe0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
1abf0 69 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  id );.      if( 
1ac00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
1ac10 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
1ac20 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
1ac30 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
1ac40 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1ac50 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
1ac60 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1ac70 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
1ac80 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1ac90 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
1aca0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1acb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1acc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
1acd0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
1ace0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1acf0 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
1ad00 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
1ad10 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
1ad20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
1ad30 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
1ad40 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1ad50 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1ad60 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
1ad70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1ad80 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1ad90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ada0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1adb0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1adc0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
1add0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
1ade0 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
1adf0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ae00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70  E_OK ){.    /* p
1ae10 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
1ae20 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63   a no-op for exc
1ae30 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
1ae40 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ae50 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ses. */.    page
1ae60 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
1ae70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ae80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1ae90 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68   sure we have th
1aea0 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20  e content for a 
1aeb0 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
1aec0 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  ge was.** previo
1aed0 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1aee0 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1aef0 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1af00 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e  t was.** just in
1af10 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1af20 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65  os instead of be
1af30 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ing read from di
1af40 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77  sk..** But now w
1af50 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20  e need the real 
1af60 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b  data off of disk
1af70 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  .  So make sure 
1af80 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20  we.** have it.  
1af90 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65  Read it in if we
1afa0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20   do not have it 
1afb0 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74  already..*/.stat
1afc0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74  ic int pager_get
1afd0 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a  _content(PgHdr *
1afe0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1aff0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1b000 44 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69 6e  D_READ ){.    in
1b010 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67  t rc = readDbPag
1b020 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70  e(pPg->pPager, p
1b030 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  Pg, pPg->pgno);.
1b040 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1b060 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
1b070 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
1b080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1b0a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1b0b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b0c0 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
1b0d0 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
1b0e0 63 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20 74  ched zero, and t
1b0f0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
1b100 69 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c 65  in the.** middle
1b110 20 6f 66 20 61 20 77 72 69 74 65 20 74 72 61 6e   of a write tran
1b120 73 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e 65  saction or opene
1b130 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  d in exclusive m
1b140 6f 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e 0a  ode, unlock it..
1b150 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
1b160 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
1b170 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
1b180 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
1b190 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
1b1a0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b1b0 29 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21 70  )==0).    && (!p
1b1c0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1b1d0 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
1b1e0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
1b1f0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
1b200 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
1b210 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
1b220 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65  *.** Drop a page
1b230 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
1b240 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  using sqlite3Pca
1b250 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a  cheDrop()..**.**
1b260 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
1b270 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20  here are now no 
1b280 70 61 67 65 73 20 77 69 74 68 20 72 65 66 65 72  pages with refer
1b290 65 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61  ences to them, a
1b2a0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
1b2b0 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
1b2c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b2d0 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a   is removed..*/.
1b2e0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1b2f0 72 44 72 6f 70 50 61 67 65 28 44 62 50 61 67 65  rDropPage(DbPage
1b300 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1b310 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1b320 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  Pager;.  sqlite3
1b330 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1b340 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
1b350 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
1b360 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
1b370 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
1b380 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1b390 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
1b3a0 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
1b3b0 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
1b3c0 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
1b3d0 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
1b3e0 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
1b3f0 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
1b400 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eased..**.** Thi
1b410 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
1b420 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
1b430 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1b440 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
1b450 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
1b460 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1b470 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
1b480 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
1b490 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
1b4a0 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
1b4b0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
1b4c0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
1b4d0 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
1b4e0 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
1b4f0 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
1b500 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
1b510 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
1b520 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
1b530 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
1b540 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
1b550 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
1b560 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
1b570 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
1b580 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
1b590 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
1b5a0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
1b5b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b5c0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
1b5d0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1b5e0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1b5f0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1b600 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
1b610 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
1b620 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
1b630 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
1b640 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
1b650 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
1b660 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1b670 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
1b680 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
1b690 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
1b6a0 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
1b6b0 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
1b6c0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
1b6d0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
1b6e0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
1b6f0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
1b700 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
1b710 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
1b720 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
1b730 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
1b740 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
1b750 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
1b760 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
1b770 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
1b780 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
1b790 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
1b7a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
1b7b0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
1b7c0 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20  t is false, the 
1b7d0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
1b7e0 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  e actually read 
1b7f0 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66  from disk..** If
1b800 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
1b810 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
1b820 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
1b830 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
1b840 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
1b850 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  ge at this time,
1b860 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20   so do not do a 
1b870 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74  disk read.  Just
1b880 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20   fill in the.** 
1b890 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74  page content wit
1b8a0 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61  h zeros.  But ma
1b8b0 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rk the fact that
1b8c0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61   we have not rea
1b8d0 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  d the.** content
1b8e0 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
1b8f0 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
1b900 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20  lag.  Later on, 
1b910 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  if .** sqlite3Pa
1b920 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1b930 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67  lled on this pag
1b940 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
1b950 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tine is.** calle
1b960 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43  d again with noC
1b970 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20  ontent==0, that 
1b980 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63  means that the c
1b990 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64  ontent is needed
1b9a0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b  .** and the disk
1b9b0 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
1b9c0 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
1b9d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b9e0 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
1b9f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1ba00 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1ba10 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
1ba20 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1ba30 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
1ba40 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1ba50 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
1ba60 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
1ba70 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
1ba80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
1ba90 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
1baa0 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
1bab0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
1bac0 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
1bad0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
1bae0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  true */.){.  PgH
1baf0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69  dr *pPg = 0;.  i
1bb00 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1bb10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1bb20 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20  =PAGER_UNLOCK . 
1bb30 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1bb40 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
1bb50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
1bb60 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e  0 .       || pgn
1bb70 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  o==1.  );..  /* 
1bb80 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
1bb90 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
1bba0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
1bbb0 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
1bbc0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65  .  ** number gre
1bbd0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
1bbe0 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75  or zero, is requ
1bbf0 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ested..  */.  if
1bc00 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
1bc10 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30  _PGNO || pgno==0
1bc20 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
1bc30 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1bc40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1bc50 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1bc60 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
1bc70 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
1bc80 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
1bc90 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
1bca0 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
1bcb0 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
1bcc0 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ge = 0;..  /* If
1bcd0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1bce0 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
1bcf0 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
1bd00 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
1bd10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bd20 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
1bd30 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1bd40 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
1bd50 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
1bd60 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
1bd70 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
1bd80 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
1bd90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bda0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1bdb0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1bdc0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1bdd0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1bde0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1bdf0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
1be00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
1be10 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20  gno, 1, &pPg);. 
1be20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1be30 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1be40 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
1be50 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b  Pg->pPager==0 ){
1be60 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
1be70 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
1be80 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
1be90 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
1bea0 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
1beb0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20  initialized..   
1bec0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
1bed0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1bee0 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
1bef0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
1bf00 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 6d   = pPager;.    m
1bf10 65 6d 73 65 74 28 70 50 67 2d 3e 70 45 78 74 72  emset(pPg->pExtr
1bf20 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  a, 0, pPager->nE
1bf30 78 74 72 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d  xtra);..    rc =
1bf40 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1bf50 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
1bf60 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72  nMax);.    if( r
1bf70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bf80 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1bf90 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1bfa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bfb0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d     }..    if( nM
1bfc0 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
1bfd0 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65  MEMDB || noConte
1bfe0 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
1bff0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
1c000 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
1c010 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1c020 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1c030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1c040 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
1c050 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
1c060 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
1c070 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c080 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
1c090 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
1c0a0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
1c0b0 44 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a  D_READ;.      }.
1c0c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1c0d0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
1c0e0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1c0f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c100 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1c110 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e  pPager, pPg, pgn
1c120 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1c130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1c140 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1c150 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1c160 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1c170 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1c180 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
1c190 72 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a  rDropPage(pPg);.
1c1a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c1b0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1c1c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1c1d0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1c1e0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
1c1f0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1c200 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
1c210 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
1c220 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
1c230 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1c240 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  he. */.    asser
1c250 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  t(sqlite3PcacheR
1c260 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
1c270 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 67  pPCache)>0 || pg
1c280 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
1c290 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1c2a0 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
1c2b0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
1c2c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
1c2d0 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
1c2e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1c2f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1c300 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1c310 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c330 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d    }..  *ppPage =
1c340 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
1c350 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c360 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
1c370 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
1c380 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
1c390 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
1c3a0 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
1c3b0 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
1c3c0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1c3d0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
1c3e0 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
1c3f0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
1c400 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1c410 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
1c420 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
1c430 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1c440 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
1c450 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1c460 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
1c470 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
1c480 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
1c490 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
1c4a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1c4b0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
1c4c0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1c4d0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
1c4e0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1c4f0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
1c500 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
1c510 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
1c520 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
1c530 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
1c540 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
1c550 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1c560 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1c570 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1c580 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
1c590 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
1c5a0 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  ;..  if( (pPager
1c5b0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1c5c0 4e 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50  NLOCK).   && (pP
1c5d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
1c5e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1c5f0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
1c600 49 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20  ITE_FULL).  ){. 
1c610 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1c620 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
1c630 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
1c640 26 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  &pPg);.  }..  re
1c650 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
1c660 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
1c670 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1c680 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
1c690 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
1c6a0 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
1c6b0 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
1c6c0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1c6d0 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
1c6e0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
1c6f0 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
1c700 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
1c710 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
1c720 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
1c730 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
1c740 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
1c750 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  t sqlite3PagerUn
1c760 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
1c770 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
1c780 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1c790 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1c7a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1c7b0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
1c7c0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
1c7d0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
1c7e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1c7f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c800 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   If the main jou
1c810 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c  rnal file has al
1c820 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
1c830 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  d, ensure that t
1c840 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  he.** sub-journa
1c850 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74  l file is open t
1c860 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  oo. If the main 
1c870 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f  journal is not o
1c880 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  pen,.** this fun
1c890 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1c8a0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
1c8b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
1c8c0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
1c8d0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
1c8e0 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
1c8f0 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
1c900 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1c910 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 74  ed if the call t
1c920 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f  o .** sqlite3OsO
1c930 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  pen() fails..*/.
1c940 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
1c950 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
1c960 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1c970 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c980 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1c990 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 21 70 50  urnalOpen && !pP
1c9a0 61 67 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74  ager->sjfd->pMet
1c9b0 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 66 28 20  hods ){.    if( 
1c9c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1c9d0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
1c9e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
1c9f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
1ca00 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
1ca10 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
1ca20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1ca30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1ca40 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
1ca50 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
1ca60 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1ca70 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
1ca80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ca90 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
1caa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1cab0 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
1cac0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
1cad0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
1cae0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
1caf0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1cb00 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
1cb10 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1cb20 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
1cb30 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
1cb40 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
1cb50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
1cb60 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
1cb70 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
1cb80 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1cb90 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
1cba0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
1cbb0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
1cbc0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger){.  sqlite3_
1cbd0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1cbe0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
1cbf0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
1cc00 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1cc10 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1cc20 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
1cc30 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74  _CREATE);..  int
1cc40 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
1cc50 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1cc60 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1cc70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cc80 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1cc90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cca0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
1ccb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1ccc0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1ccd0 72 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  r, 0);.  pPager-
1cce0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
1ccf0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
1cd00 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
1cd10 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1cd20 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
1cd30 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1cd40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
1cd50 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1cd60 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20  _journal;.  }.. 
1cd70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1cd80 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  rnalOpen==0 ){. 
1cd90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
1cda0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
1cdb0 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
1cdc0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1cdd0 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
1cde0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _TEMP_JOURNAL);.
1cdf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ce00 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
1ce10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1ce20 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NAL);.    }.    
1ce30 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1ce40 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
1ce50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
1ce60 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y ){.      sqlit
1ce70 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
1ce80 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
1ce90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cea0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1ceb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1cec0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
1ced0 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  E.      rc = sql
1cee0 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
1cef0 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c  .          pVfs,
1cf00 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1cf10 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
1cf20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
1cf30 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
1cf40 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
1cf50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1cf60 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
1cf70 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
1cf80 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
1cf90 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
1cfa0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
1cfb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1cfc0 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
1cfd0 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 70 50 61  thods );.    pPa
1cfe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1cff0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1d000 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
1d010 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1d020 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
1d030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d040 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
1d050 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
1d060 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d070 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
1d080 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d090 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
1d0a0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
1d0b0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1d0c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
1d0d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1d0e0 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
1d0f0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1d100 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
1d110 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
1d120 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1d130 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1d140 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
1d150 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
1d160 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
1d170 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1d180 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
1d190 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
1d1a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1d1b0 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
1d1c0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1d1d0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1d1e0 6e 53 61 76 65 70 6f 69 6e 74 20 26 26 20 72 63  nSavepoint && rc
1d1f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d200 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
1d210 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1d220 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1d230 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1d240 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72  QLITE_NOMEM && r
1d250 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1d260 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20  NOMEM ){.    rc 
1d270 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1d280 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1d290 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
1d2a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d2b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
1d2c0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
1d2d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69   return rc;..fai
1d2e0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1d2f0 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33 42 69  nal:.  sqlite3Bi
1d300 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
1d310 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
1d320 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
1d330 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  urnal = 0;.  ret
1d340 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d350 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
1d360 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1d370 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
1d380 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
1d390 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
1d3a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
1d3b0 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
1d3c0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1d3d0 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20  itPhaseTwo() is 
1d3e0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1d3f0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1d400 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
1d410 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
1d420 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
1d430 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1d440 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1d450 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
1d460 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
1d470 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
1d480 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
1d490 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
1d4a0 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
1d4b0 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
1d4c0 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
1d4d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
1d4e0 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
1d4f0 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
1d500 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
1d510 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
1d520 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1d530 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1d540 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
1d550 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
1d560 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1d570 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1d580 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
1d590 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1d5a0 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
1d5b0 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
1d5c0 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
1d5d0 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
1d5e0 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
1d5f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1d600 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
1d610 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1d620 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
1d630 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
1d640 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
1d650 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
1d660 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
1d670 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
1d680 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
1d690 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
1d6a0 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
1d6b0 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
1d6c0 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
1d6d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1d6e0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1d6f0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
1d700 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
1d710 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
1d720 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1d730 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
1d740 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
1d750 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
1d760 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1d770 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
1d780 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
1d790 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
1d7a0 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
1d7b0 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
1d7c0 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
1d7d0 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
1d7e0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
1d7f0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
1d800 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
1d810 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
1d820 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
1d830 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1d840 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1d850 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d860 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1d870 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
1d880 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1d890 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1d8a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1d8b0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1d8c0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
1d8d0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
1d8e0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
1d8f0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
1d900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d910 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1d920 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
1d930 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d950 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1d960 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
1d970 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 46 6c  ;.      if( exFl
1d980 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
1d990 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1d9a0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1d9b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1d9c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d9d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d9e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1d9f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1da00 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1da10 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 50 41 47  che = 0;.    PAG
1da20 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
1da30 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
1da40 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
1da50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1da60 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
1da70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
1da80 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50             && pP
1da90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1daa0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
1dab0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
1dac0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
1dad0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
1dae0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1daf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1db00 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1db10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1db20 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1db30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
1db40 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
1db50 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
1db60 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20  mode the last.  
1db70 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
1db80 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
1db90 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
1dba0 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
1dbb0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
1dbc0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
1dbd0 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
1dbe0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
1dbf0 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
1dc00 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
1dc10 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63  either was trunc
1dc20 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20  ated to 0 bytes 
1dc30 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61  or its header wa
1dc40 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69  s.    ** overwri
1dc50 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tten with zeros.
1dc60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1dc70 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
1dc80 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1dc90 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
1dca0 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  gSize==0 );.    
1dcb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dcc0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
1dcd0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1dce0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1dcf0 72 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65  r, 0);.    pPage
1dd00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
1dd10 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
1dd20 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ate( pPager->dbS
1dd30 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21  ize );.    if( !
1dd40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1dd50 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
1dd60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1dd70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dd80 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1dd90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1dda0 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ize;.      rc = 
1ddb0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1ddc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1ddd0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50   }.  assert( !pP
1dde0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1ddf0 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
1de00 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21  rnalOff>0 || rc!
1de10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1de20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1de30 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
1de40 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
1de50 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
1de60 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1de70 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
1de80 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
1de90 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
1dea0 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
1deb0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
1dec0 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
1ded0 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
1dee0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
1def0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1df00 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
1df10 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
1df20 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
1df30 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
1df40 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
1df50 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
1df60 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
1df70 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
1df80 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
1df90 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1dfa0 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
1dfb0 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
1dfc0 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
1dfd0 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
1dfe0 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
1dff0 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
1e000 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
1e010 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
1e020 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1e030 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
1e040 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1e050 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
1e060 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
1e070 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
1e080 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
1e090 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1e0a0 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
1e0b0 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
1e0c0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
1e0d0 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
1e0e0 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
1e0f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1e100 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
1e110 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
1e120 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1e130 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67  () or sqlite3Pag
1e140 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  erRollback() to.
1e150 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61  ** reset..*/.sta
1e160 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
1e170 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
1e180 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
1e190 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50   pPg->pData;.  P
1e1a0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1e1b0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1e1c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e1d0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
1e1e0 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
1e1f0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1e200 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
1e210 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1e220 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
1e230 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
1e240 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1e250 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
1e260 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1e270 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
1e280 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
1e290 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1e2a0 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f   page was previo
1e2b0 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1e2c0 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1e2d0 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   that means.  **
1e2e0 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c   we didn't reall
1e2f0 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f  y read in the co
1e300 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1e310 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  e.  This can hap
1e320 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78  pen.  ** (for ex
1e330 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20  ample) when the 
1e340 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f  page is being mo
1e350 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ved to the freel
1e360 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e  ist.  But.  ** n
1e370 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61  ow we are (perha
1e380 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70  ps) moving the p
1e390 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66  age off of the f
1e3a0 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a  reelist for.  **
1e3b0 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65   reuse and we ne
1e3c0 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f  ed to know its o
1e3d0 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
1e3e0 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a  so that content.
1e3f0 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72    ** can be stor
1e400 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
1e410 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20  ck journal.  So 
1e420 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74  do the read at t
1e430 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20  his.  ** time.. 
1e440 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
1e450 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
1e460 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1e470 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e480 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
1e490 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
1e4a0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
1e4b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1e4c0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
1e4d0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
1e4e0 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
1e4f0 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
1e500 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
1e510 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
1e520 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
1e530 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
1e540 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
1e550 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
1e560 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
1e570 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
1e580 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  ified = 1;.  }el
1e590 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
1e5a0 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
1e5b0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1e5c0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
1e5d0 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
1e5e0 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
1e5f0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
1e600 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
1e610 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
1e620 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
1e630 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
1e640 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
1e650 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1e660 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
1e670 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74      ** create it
1e680 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
1e690 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1e6a0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1e6b0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1e6c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1e6d0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
1e6e0 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  g, 0);.    if( r
1e6f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e700 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e710 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1e720 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1e730 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1e740 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
1e750 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1e760 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
1e770 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20  ournal.         
1e780 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1e790 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
1e7a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
1e7b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1e7c0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1e7d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1e7e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e7f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e800 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1e810 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1e820 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
1e830 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20  dified = 1;.  . 
1e840 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
1e850 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
1e860 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
1e870 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
1e880 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
1e890 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1e8a0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1e8b0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
1e8c0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1e8d0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
1e8e0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1e8f0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1e900 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1e910 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67   */.    if( !pag
1e920 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
1e930 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1e940 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
1e950 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
1e960 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1e970 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  e ){.        u32
1e980 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
1e990 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1e9a0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
1e9b0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
1e9c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1e9d0 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
1e9e0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
1e9f0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
1ea00 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
1ea10 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
1ea20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
1ea30 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
1ea40 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
1ea50 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
1ea60 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1ea70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1ea80 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
1ea90 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1eaa0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1eab0 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d  .        cksum =
1eac0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
1ead0 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
1eae0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1eaf0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
1eb00 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1eb10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67  >journalOff, pPg
1eb20 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1eb30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1eb40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1eb50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1eb60 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1eb70 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1eb80 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1ebb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29  >journalOff + 4)
1ebc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1ebd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
1ebe0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1ebf0 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ze+4;.        }.
1ec00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1ec10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ec20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
1ec30 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
1ec40 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
1ec50 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b  rnalOff, cksum);
1ec60 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1ec70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
1ec80 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
1ec90 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1eca0 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
1ecb0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1ecc0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1ece0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1ecf0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ed00 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  ));.        PAGE
1ed10 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1ed20 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
1ed30 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  t);.        PAGE
1ed40 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c  RTRACE(("JOURNAL
1ed50 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
1ed60 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
1ed70 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1ed80 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1ed90 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1eda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
1edb0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1edc0 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
1edd0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1ede0 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20  (pPg)));..      
1edf0 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
1ee00 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
1ee10 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
1ee20 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
1ee30 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
1ee40 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  age in the block
1ee50 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20   above, set the 
1ee60 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66  need-sync flag f
1ee70 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  or the page..   
1ee80 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
1ee90 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  e, when the tran
1eea0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1eeb0 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69  d back, the logi
1eec0 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  c in.        ** 
1eed0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1eee0 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74  e() will think t
1eef0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
1ef00 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
1ef10 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
1ef20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ef30 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20  e. And if an IO 
1ef40 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1ef50 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20  le doing so,.   
1ef60 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72       ** then cor
1ef70 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
1ef80 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ow..        */. 
1ef90 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
1efa0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
1efb0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
1efc0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1efd0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
1efe0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1eff0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
1f000 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
1f010 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
1f020 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
1f030 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1f040 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  he .        ** t
1f050 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
1f060 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
1f070 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
1f080 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1f090 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f0a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f0b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f0c0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f0d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
1f0e0 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
1f0f0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1f100 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
1f110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f120 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
1f130 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
1f140 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1f150 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
1f160 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
1f170 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1f190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
1f1a0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  M );.        rc 
1f1b0 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  |= addToSavepoin
1f1c0 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
1f1d0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1f1e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f1f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f200 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1f210 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
1f220 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f230 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1f240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f250 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1f260 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1f270 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
1f280 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
1f290 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
1f2a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
1f2b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1f2c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1f2d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f2e0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
1f2f0 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
1f300 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1f330 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
1f340 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
1f350 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1f360 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
1f370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f380 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1f390 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1f3a0 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
1f3b0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
1f3c0 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
1f3d0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1f3e0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
1f3f0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1f400 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
1f410 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
1f420 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
1f430 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
1f440 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
1f450 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
1f460 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
1f470 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
1f480 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
1f490 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
1f4a0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
1f4b0 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
1f4c0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
1f4d0 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
1f4e0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1f4f0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f500 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
1f510 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1f520 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1f530 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
1f540 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
1f550 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1f560 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1f570 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1f580 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1f590 69 7a 65 3d 3d 28 50 41 47 45 52 5f 4d 4a 5f 50  ize==(PAGER_MJ_P
1f5a0 47 4e 4f 28 70 50 61 67 65 72 29 2d 31 29 20 29  GNO(pPager)-1) )
1f5b0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1f5c0 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a  dbSize++;.    }.
1f5d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f5e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1f5f0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1f600 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70  to mark a data-p
1f610 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e  age as writable.
1f620 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67   It uses .** pag
1f630 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70  er_write() to op
1f640 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
1f650 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
1f660 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a  already open).**
1f670 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70   and write the p
1f680 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68  age *pData to th
1f690 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1f6a0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1f6b0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
1f6c0 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
1f6d0 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
1f6e0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1f6f0 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
1f700 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
1f710 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
1f720 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
1f730 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
1f740 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
1f750 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
1f760 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
1f770 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
1f780 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
1f790 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
1f7a0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
1f7b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
1f7c0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
1f7d0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
1f7e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
1f7f0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
1f800 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
1f810 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1f820 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
1f830 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
1f840 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
1f850 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f860 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
1f870 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
1f880 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
1f890 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
1f8a0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1f8b0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
1f8c0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
1f8d0 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
1f8e0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1f8f0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
1f900 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
1f910 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
1f920 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1f930 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f940 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
1f950 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
1f960 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
1f970 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  ii;.    int need
1f980 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
1f990 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
1f9a0 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ync flag to 1. T
1f9b0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
1f9c0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61  e cannot allow a
1f9d0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1f9e0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
1f9f0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
1fa00 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
1fa10 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1fa20 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
1fa30 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
1fa40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1fa50 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1fa60 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1fa70 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
1fa80 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
1fa90 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
1faa0 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
1fab0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
1fac0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
1fad0 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
1fae0 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
1faf0 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
1fb00 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
1fb10 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
1fb20 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1fb30 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1fb40 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
1fb50 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
1fb60 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
1fb70 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
1fb80 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ..    sqlite3Pag
1fb90 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1fba0 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67  er, (int *)&nPag
1fbb0 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28  eCount);.    if(
1fbc0 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
1fbd0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1fbe0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
1fbf0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
1fc00 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
1fc10 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
1fc20 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
1fc30 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1fc40 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
1fc50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fc60 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
1fc70 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
1fc80 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
1fc90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
1fca0 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
1fcb0 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
1fcc0 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
1fcd0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
1fce0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
1fcf0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
1fd00 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
1fd10 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
1fd20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
1fd30 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
1fd40 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
1fd50 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
1fd60 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1fd70 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
1fd80 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
1fd90 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1fda0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1fdb0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1fdc0 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
1fdd0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
1fde0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fdf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fe00 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1fe10 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1fe20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1fe30 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1fe40 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
1fe50 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
1fe60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
1fe70 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
1fe80 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
1fe90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1feb0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
1fec0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1fee0 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
1fef0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1ff00 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
1ff10 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1ff20 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
1ff30 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
1ff40 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
1ff50 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
1ff60 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1ff70 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
1ff80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ff90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48     /* If the PGH
1ffa0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
1ffb0 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
1ffc0 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
1ffd0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
1ffe0 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
1fff0 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
20000 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
20010 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
20020 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
20030 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
20040 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
20050 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
20060 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
20070 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
20080 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
20090 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
200a0 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
200b0 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
200c0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
200d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
200e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
200f0 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29    if( needSync )
20100 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20110 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
20120 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  ->noSync==0 );. 
20130 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
20140 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53  i<nPage && needS
20150 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ync; ii++){.    
20160 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
20170 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
20180 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
20190 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
201a0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
201b0 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20  pPage->flags |= 
201c0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
201d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
201e0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
201f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
20200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
20210 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
20220 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Sync);.    }..  
20230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20240 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
20250 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
20260 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
20270 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
20280 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
20290 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
202a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
202b0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
202c0 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
202d0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
202e0 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
202f0 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
20300 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
20310 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
20320 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
20330 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
20340 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
20350 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
20360 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
20370 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
20380 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
20390 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
203a0 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  n pPg->flags&PGH
203b0 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64  DR_DIRTY;.}.#end
203c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
203d0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
203e0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
203f0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
20400 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
20410 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
20420 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
20430 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
20440 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
20450 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
20460 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
20470 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
20480 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
20490 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
204a0 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
204b0 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
204c0 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
204d0 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
204e0 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
204f0 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
20500 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
20510 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
20520 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
20530 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
20540 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
20550 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
20560 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
20570 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
20580 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
20590 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
205a0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
205b0 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
205c0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
205d0 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
205e0 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
205f0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
20600 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
20610 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
20620 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
20630 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
20640 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
20650 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
20660 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
20670 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
20680 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
20690 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
206a0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
206b0 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
206c0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
206d0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  o sqlite3PagerDo
206e0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
206f0 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
20700 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
20710 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
20720 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
20730 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
20740 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
20750 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
20760 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
20770 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
20780 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
20790 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
207a0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
207b0 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
207c0 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
207d0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
207e0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
207f0 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
20800 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
20810 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
20820 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
20830 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
20840 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
20850 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
20860 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
20870 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
20880 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
20890 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  d.  But because 
208a0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
208b0 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61  ains critical da
208c0 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  ta, we still nee
208d0 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20  d to be sure it 
208e0 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  gets.** rolled b
208f0 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20  ack in spite of 
20900 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
20910 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63  DontRollback() c
20920 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  all..*/.int sqli
20930 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
20940 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
20950 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
20960 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
20970 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
20980 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
20990 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d   rc;..  if( pPg-
209a0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
209b0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
209c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
209d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
209e0 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
209f0 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ack==0 ){.    as
20a00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
20a10 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
20a20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
20a30 6f 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  ollback = sqlite
20a40 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
20a50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
20a60 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
20a70 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
20a80 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ack ){.      ret
20a90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
20aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
20ab0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
20ac0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77  Set(pPager->pAlw
20ad0 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67  aysRollback, pPg
20ae0 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  ->pgno);..  if( 
20af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20b00 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
20b10 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61  DR_DIRTY) && pPa
20b20 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
20b30 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
20b40 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
20b50 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
20b60 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
20b70 3e 64 62 53 69 7a 65 3d 3d 70 50 67 2d 3e 70 67  >dbSize==pPg->pg
20b80 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  no && pPager->db
20b90 4f 72 69 67 53 69 7a 65 3c 70 50 61 67 65 72 2d  OrigSize<pPager-
20ba0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
20bb0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
20bc0 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
20bd0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
20be0 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
20bf0 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
20c00 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
20c10 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
20c20 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
20c30 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
20c40 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
20c50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20c60 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
20c70 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
20c80 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
20c90 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
20ca0 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
20cb0 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
20cc0 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
20cd0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
20ce0 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
20cf0 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
20d00 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
20d10 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
20d20 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
20d30 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
20d40 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
20d50 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
20d60 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
20d70 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
20d80 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
20d90 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
20da0 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
20db0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
20dc0 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  (("DONT_WRITE pa
20dd0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
20de0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
20df0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
20e00 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
20e10 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
20e20 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
20e30 29 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61  ).      pPg->fla
20e40 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54  gs |= PGHDR_DONT
20e50 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53  _WRITE;.#ifdef S
20e60 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
20e70 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
20e80 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
20e90 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
20ea0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  dif.    }.  }.  
20eb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20ec0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
20ed0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
20ee0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
20ef0 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
20f00 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
20f10 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
20f20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
20f30 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
20f40 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
20f50 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
20f60 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
20f70 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
20f80 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
20f90 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
20fa0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  nal..**.** If we
20fb0 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63   have not yet ac
20fc0 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20  tually read the 
20fd0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
20fe0 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20  page (if.** the 
20ff0 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
21000 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e  lag is set) then
21010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   this routine ac
21020 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a  ts as a promise.
21030 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ** that we will 
21040 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65  never need to re
21050 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ad the page cont
21060 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  ent in the futur
21070 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65  e..** so the nee
21080 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62  dRead flag can b
21090 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69  e cleared at thi
210a0 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  s point..*/.void
210b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
210c0 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65  tRollback(DbPage
210d0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
210e0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
210f0 50 61 67 65 72 3b 0a 20 20 54 45 53 54 4f 4e 4c  Pager;.  TESTONL
21100 59 28 20 69 6e 74 20 72 63 3b 20 29 20 20 2f 2a  Y( int rc; )  /*
21110 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
21120 6f 6d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  om sqlite3Bitvec
21130 53 65 74 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65  Set() */..  asse
21140 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21150 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
21160 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  D );..  /* If th
21170 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
21180 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44  s not open, or D
21190 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 62  ontWrite() has b
211a0 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20  een called on.  
211b0 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28 44 6f  ** this page (Do
211c0 6e 74 57 72 69 74 65 28 29 20 73 65 74 73 20 74  ntWrite() sets t
211d0 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
211e0 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20 74 68  k flag), then th
211f0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
21200 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
21210 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
21220 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 0a  journalOpen==0 .
21230 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74     || sqlite3Bit
21240 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
21250 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c  pAlwaysRollback,
21260 20 70 50 67 2d 3e 70 67 6e 6f 29 0a 20 20 20 7c   pPg->pgno).   |
21270 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
21280 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20  er->dbOrigSize. 
21290 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
212a0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
212b0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
212c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 69  .  if( sqlite3Bi
212d0 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
212e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
212f0 2d 3e 70 67 6e 6f 29 21 3d 30 0a 20 20 20 7c 7c  ->pgno)!=0.   ||
21300 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
21310 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
21320 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
21330 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
21340 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 69   SECURE_DELETE i
21350 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
21360 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
21370 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
21380 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63  routine can be c
21390 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 20  alled on a page 
213a0 66 6f 72 20 77 68 69 63 68 20 73 71 6c 69 74 65  for which sqlite
213b0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
213c0 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62  ).  ** has not b
213d0 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63  een previously c
213e0 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 68 65  alled during the
213f0 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
21400 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 44  n..  ** And if D
21410 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 70  ontWrite() has p
21420 72 65 76 69 6f 75 73 6c 79 20 62 65 65 6e 20 63  reviously been c
21430 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f  alled, the follo
21440 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74  wing.  ** condit
21450 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74  ions must be met
21460 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 4c 61 74  ..  **.  ** (Lat
21470 65 72 3a 29 20 20 4e 6f 74 20 74 72 75 65 2e 20  er:)  Not true. 
21480 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
21490 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 62 79   is corrupted by
214a0 20 68 61 76 69 6e 67 20 64 75 70 6c 69 63 61 74   having duplicat
214b0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6f 6e 20  e.  ** pages on 
214c0 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 65 78  the freelist (ex
214d0 3a 20 63 6f 72 72 75 70 74 39 2e 74 65 73 74 29  : corrupt9.test)
214e0 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
214f0 69 6e 67 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ing is not.  ** 
21500 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65  necessarily true
21510 3a 0a 20 20 2a 2f 0a 20 20 2f 2a 20 61 73 73 65  :.  */.  /* asse
21520 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  rt( !pPg->inJour
21530 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
21540 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
21550 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 20 2a  >dbOrigSize ); *
21560 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
21570 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
21580 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 66 6c 61  =0 );.  pPg->fla
21590 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
215a0 44 5f 52 45 41 44 3b 0a 0a 20 20 2f 2a 20 46 61  D_READ;..  /* Fa
215b0 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
215c0 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
215d0 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
215e0 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
215f0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
21600 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
21610 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
21620 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
21630 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
21640 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
21650 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
21660 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
21670 20 73 75 72 65 20 74 6f 20 74 65 73 74 20 74 68   sure to test th
21680 65 0a 20 20 2a 2a 20 63 61 73 65 20 77 68 65 72  e.  ** case wher
21690 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
216a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
216b0 79 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 69  ying to set a bi
216c0 74 20 69 6e 20 61 20 0a 20 20 2a 2a 20 62 69 74  t in a .  ** bit
216d0 20 76 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   vector..  */.  
216e0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
216f0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 54 45  gnMalloc();.  TE
21700 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
21710 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
21720 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
21730 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
21740 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
21750 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
21760 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
21770 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
21780 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
21790 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74   pPg->pgno);.  t
217a0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
217b0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 73  ITE_NOMEM );.  s
217c0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
217d0 61 6c 6c 6f 63 28 29 3b 0a 0a 0a 20 20 50 41 47  alloc();...  PAG
217e0 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 52  ERTRACE(("DONT_R
217f0 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20  OLLBACK page %d 
21800 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
21810 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
21820 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
21830 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25  E(("GARBAGE %p %
21840 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
21850 67 2d 3e 70 67 6e 6f 29 29 0a 7d 0a 0a 0a 2f 2a  g->pgno)).}.../*
21860 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21870 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
21880 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61  crement the data
21890 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
218a0 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f  -counter,.** sto
218b0 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f  red at byte 24 o
218c0 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
218d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
218e0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
218f0 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
21900 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
21910 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  rect){.  PgHdr *
21920 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68  pPgHdr;.  u32 ch
21930 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20  ange_counter;.  
21940 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21950 4f 4b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  OK;..#ifndef SQL
21960 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
21970 43 5f 57 52 49 54 45 0a 20 20 61 73 73 65 72 74  C_WRITE.  assert
21980 28 20 69 73 44 69 72 65 63 74 3d 3d 30 20 29 3b  ( isDirect==0 );
21990 20 20 2f 2a 20 69 73 44 69 72 65 63 74 20 69 73    /* isDirect is
219a0 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72 20 61   only true for a
219b0 74 6f 6d 69 63 20 77 72 69 74 65 73 20 2a 2f 0a  tomic writes */.
219c0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50  #endif.  if( !pP
219d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
219e0 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d  tDone && pPager-
219f0 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
21a00 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
21a10 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
21a20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
21a30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21a40 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
21a50 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
21a60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21a70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
21a80 20 20 69 66 28 20 21 69 73 44 69 72 65 63 74 20    if( !isDirect 
21a90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21aa0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
21ab0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69  pPgHdr);.      i
21ac0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21ae0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
21af0 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 72  gHdr);.        r
21b00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
21b10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
21b20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
21b30 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
21b40 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
21b50 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
21b60 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
21b70 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
21b80 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
21b90 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
21ba0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
21bb0 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ++;.    put32bit
21bc0 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
21bd0 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
21be0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 23  nge_counter);..#
21bf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
21c00 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
21c10 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65 63  .    if( isDirec
21c20 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d  t && pPager->fd-
21c30 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
21c40 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
21c50 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44  Buf = pPgHdr->pD
21c60 61 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ata;.      asser
21c70 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  t( pPager->dbFil
21c80 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20  eSize>0 );.     
21c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
21ca0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
21cb0 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
21cc0 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
21cd0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
21ce0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
21cf0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
21d00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
21d10 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
21d20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
21d30 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
21d40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
21d60 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74  the pager file t
21d70 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
21d80 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
21d90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21da0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
21db0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20  MEMDB ){.    rc 
21dc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
21dd0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
21de0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
21df0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
21e00 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
21e10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21e20 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
21e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
21e40 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
21e50 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
21e60 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
21e70 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
21e80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
21e90 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
21ea0 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
21eb0 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
21ec0 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
21ed0 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
21ee0 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
21ef0 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
21f00 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
21f10 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
21f20 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
21f30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
21f40 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
21f50 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
21f60 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
21f70 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
21f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21f90 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
21fa0 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
21fb0 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
21fc0 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
21fd0 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
21fe0 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
21ff0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
22000 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
22010 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
22020 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
22030 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
22040 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
22050 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
22060 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
22070 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
22080 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
22090 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
220a0 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
220b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61  *.** If the fina
220c0 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f  l parameter - no
220d0 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20  Sync - is true, 
220e0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
220f0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a  e file itself.**
22100 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20   is not synced. 
22110 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
22120 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
22130 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79  rSync() directly
22140 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20   to.** sync the 
22150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
22160 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d  fore calling Com
22170 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f  mitPhaseTwo() to
22180 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a   delete the.** j
22190 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
221a0 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74  his case..*/.int
221b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
221c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50  mitPhaseOne(.  P
221d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
221e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
221f0 73 74 65 72 2c 20 0a 20 20 69 6e 74 20 6e 6f 53  ster, .  int noS
22200 79 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  ync.){.  int rc 
22210 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22220 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
22230 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
22240 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
22250 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  e;.  }..  /* If 
22260 6e 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65 20  no changes have 
22270 62 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63 61  been made, we ca
22280 6e 20 6c 65 61 76 65 20 74 68 65 20 74 72 61 6e  n leave the tran
22290 73 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20  saction early.. 
222a0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
222b0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
222c0 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  &&.        (pPag
222d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
222e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
222f0 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20  DE_DELETE ||.   
22300 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
22310 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29  xclusiveMode!=0)
22320 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22330 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
22340 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
22350 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
22360 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
22380 50 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54  PAGERTRACE(("DAT
22390 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
223a0 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
223b0 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  Size=%d\n", .   
223c0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
223d0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  name, zMaster, p
223e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b  Pager->dbSize));
223f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
22400 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
22410 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
22420 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
22430 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
22440 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
22450 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
22460 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
22470 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
22480 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
22490 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
224a0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
224b0 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
224c0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69   PgHdr *pPg;..#i
224d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
224e0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
224f0 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69      /* The atomi
22500 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
22510 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
22520 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20   if all of the. 
22530 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
22540 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a  are true:.    **
22550 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
22560 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
22570 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
22580 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
22590 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  for.    **      
225a0 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
225b0 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20  age-size, and.  
225c0 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63    **    + This c
225d0 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
225e0 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
225f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
22600 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45  nd.    **    + E
22610 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
22620 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
22630 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
22640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
22650 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
22660 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
22670 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
22680 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
22690 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
226a0 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74  .    ** be creat
226b0 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
226c0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  saction..    */.
226d0 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69      int useAtomi
226e0 63 57 72 69 74 65 3b 0a 20 20 20 20 70 50 67 20  cWrite;.    pPg 
226f0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
22700 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
22710 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 75  >pPCache);.    u
22720 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20  seAtomicWrite = 
22730 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74  (.        !zMast
22740 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  er && .        p
22750 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
22760 65 6e 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  en &&.        pP
22770 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22780 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
22790 28 70 50 61 67 65 72 29 20 26 26 20 0a 20 20 20  (pPager) && .   
227a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
227b0 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize>=pPager->dbF
227c0 69 6c 65 53 69 7a 65 20 26 26 20 0a 20 20 20 20  ileSize && .    
227d0 20 20 20 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70      (pPg==0 || p
227e0 50 67 2d 3e 70 44 69 72 74 79 3d 3d 30 29 0a 20  Pg->pDirty==0). 
227f0 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
22800 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
22810 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
22820 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
22830 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
22840 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 75  OFF );.    if( u
22850 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b  seAtomicWrite ){
22860 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
22870 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
22880 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
22890 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ile. */.      in
228a0 74 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  t offset = pPage
228b0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
228c0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
228d0 61 67 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73  agic);.      ass
228e0 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63  ert(pPager->nRec
228f0 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ==1);.      rc =
22900 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
22910 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74  ger->jfd, offset
22920 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
22930 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
22940 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68  e the db file ch
22950 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68  ange counter. Th
22960 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
22970 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20   will modify.   
22980 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d     ** the in-mem
22990 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
229a0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  on of page 1 to 
229b0 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61  include the upda
229c0 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61  ted.      ** cha
229d0 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20  nge counter and 
229e0 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20  then write page 
229f0 31 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  1 directly to th
22a00 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
22a10 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73   ** file. Becaus
22a20 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
22a30 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f  write property o
22a40 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d  f the host file-
22a50 73 79 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a  system, .      *
22a60 2a 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  * this is safe..
22a70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
22a80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22a90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22aa0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
22ab0 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
22ac0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
22ad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
22ae0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
22af0 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  alCreate(pPager-
22b00 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
22b10 20 20 69 66 28 20 21 75 73 65 41 74 6f 6d 69 63    if( !useAtomic
22b20 57 72 69 74 65 20 26 26 20 72 63 3d 3d 53 51 4c  Write && rc==SQL
22b30 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a  ITE_OK ).#endif.
22b40 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
22b50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
22b60 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
22b70 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
22b80 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
22b90 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
22ba0 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
22bb0 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
22bc0 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
22bd0 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
22be0 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
22bf0 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
22c00 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
22c10 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
22c20 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
22c30 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
22c40 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
22c50 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
22c60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
22c70 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
22c80 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
22c90 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
22ca0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
22cb0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
22cc0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
22cd0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
22ce0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
22cf0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22d00 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
22d10 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 69  nc_exit;.      i
22d20 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
22d30 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
22d40 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
22d50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22d60 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
22d70 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
22d80 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65  er->dbSize<pPage
22d90 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
22da0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
22db0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
22dc0 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
22dd0 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
22de0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
22df0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69            ** bei
22e00 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
22e10 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
22e20 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
22e30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
22e40 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
22e50 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
22e60 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a          Pgno i;.
22e70 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
22e80 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
22e90 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20  PGNO(pPager);.  
22ea0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 64 62 53          Pgno dbS
22eb0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
22ec0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
22ed0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
22ee0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
22ef0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ize;.          f
22f00 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20  or( i=dbSize+1; 
22f10 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  i<=pPager->dbOri
22f20 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  gSize; i++ ){.  
22f30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
22f40 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
22f50 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
22f60 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53  nal, i) && i!=iS
22f70 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
22f80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22f90 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
22fa0 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , i, &pPg);.    
22fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
22fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
22fd0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23000 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  te(pPg);.       
23010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
23020 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
23040 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23050 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
23060 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23070 20 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20           } .    
23080 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
23090 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20  Size = dbSize;. 
230a0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
230b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
230c0 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
230d0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
230e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
230f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
23100 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
23110 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
23120 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
23130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23140 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23150 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
23160 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72  exit;..    /* Wr
23170 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
23180 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
23190 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
231a0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
231b0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
231c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
231d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
231e0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
231f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
23200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23210 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
23220 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
23230 45 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  ED );.      /* T
23240 68 65 20 65 72 72 6f 72 20 6d 69 67 68 74 20 68  he error might h
23250 61 76 65 20 6c 65 66 74 20 74 68 65 20 64 69 72  ave left the dir
23260 74 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c  ty list all foul
23270 65 64 20 75 70 20 68 65 72 65 2c 0a 20 20 20 20  ed up here,.    
23280 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 64 6f    ** but that do
23290 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62 65  es not matter be
232a0 63 61 75 73 65 20 69 66 20 74 68 65 20 69 66 20  cause if the if 
232b0 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 64  the dirty list d
232c0 69 64 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 20  id.      ** get 
232d0 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
232e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
232f0 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61  will roll back a
23300 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 63  nd.      ** disc
23310 61 72 64 20 74 68 65 20 64 69 72 74 79 20 6c 69  ard the dirty li
23320 73 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e  st.  There is an
23330 20 61 73 73 65 72 74 20 69 6e 0a 20 20 20 20 20   assert in.     
23340 20 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f 61 6c   ** pager_get_al
23350 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 29 20  l_dirty_pages() 
23360 74 68 61 74 20 76 65 72 69 66 69 65 73 20 74 68  that verifies th
23370 61 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20  at no attempt.  
23380 20 20 20 20 2a 2a 20 69 73 20 6d 61 64 65 20 74      ** is made t
23390 6f 20 75 73 65 20 61 6e 20 69 6e 76 61 6c 69 64  o use an invalid
233a0 20 64 69 72 74 79 20 6c 69 73 74 2e 0a 20 20 20   dirty list..   
233b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f     */.      goto
233c0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
233d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  }.    sqlite3Pca
233e0 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
233f0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
23400 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
23410 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
23420 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
23430 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23440 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
23450 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20  XCLUSIVE );.    
23460 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
23470 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
23480 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
23490 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
234a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
234b0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  nc_exit;.    }..
234c0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
234d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
234e0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
234f0 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f  r->noSync && !no
23500 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
23510 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
23520 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
23530 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
23540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
23550 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c  ACE(("DBSYNC %p\
23560 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
23570 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
23580 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
23590 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
235a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
235b0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
235c0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69  {.    /* pager_i
235d0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
235e0 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20  r() may attempt 
235f0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  to obtain an exc
23600 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f  lusive.     * lo
23610 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20  ck to spill the 
23620 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e  cache and return
23630 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20   IOERR_BLOCKED. 
23640 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20  But since .     
23650 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * there is no ch
23660 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69  ance the cache i
23670 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20  s inconsistent, 
23680 69 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74  it is.     * bet
23690 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ter to return SQ
236a0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20  LITE_BUSY..     
236b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
236c0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72  TE_BUSY;.  }.  r
236d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
236e0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
236f0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
23700 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
23710 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
23720 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
23730 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
23740 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
23750 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
23760 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
23770 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
23780 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
23790 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
237a0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
237b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
237c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
237d0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67  mmitPhaseTwo(Pag
237e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
237f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23800 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
23810 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
23820 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
23830 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
23840 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
23850 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
23860 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
23870 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
23880 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
23890 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20  Modified==0 &&. 
238a0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
238b0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
238c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
238d0 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20  ELETE ||.       
238e0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
238f0 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a  siveMode!=0) ){.
23900 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23910 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
23920 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 || pPager->jou
23930 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
23940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23950 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52  _OK;.  }.  PAGER
23960 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25  TRACE(("COMMIT %
23970 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
23980 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72  ager)));.  asser
23990 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
239a0 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c  ==PAGER_SYNCED |
239b0 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67  | MEMDB || !pPag
239c0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
239d0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
239e0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
239f0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
23a00 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  etMaster);.  rc 
23a10 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
23a20 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 72 65 74  ager, rc);.  ret
23a30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23a40 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
23a50 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
23a60 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
23a70 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
23a80 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
23a90 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
23aa0 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
23ab0 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
23ac0 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
23ad0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
23ae0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
23af0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
23b00 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
23b10 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
23b20 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
23b30 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
23b40 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
23b50 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
23b60 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
23b70 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
23b80 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
23b90 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
23ba0 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
23bb0 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
23bc0 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
23bd0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
23be0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
23bf0 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
23c00 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
23c10 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
23c20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
23c30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
23c40 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
23c50 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
23c60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
23c70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23c80 54 45 5f 4f 4b 3b 0a 20 20 50 41 47 45 52 54 52  TE_OK;.  PAGERTR
23c90 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE(("ROLLBACK %
23ca0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
23cb0 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21  ager)));.  if( !
23cc0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
23cd0 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
23ce0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
23cf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
23d00 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
23d10 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
23d20 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65  Master);.  }else
23d30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
23d40 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
23d50 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
23d60 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
23d70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
23d80 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
23d90 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
23da0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
23db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
23dc0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
23dd0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
23de0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
23df0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
23e00 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
23e10 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  c2;.      rc = p
23e20 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
23e30 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
23e40 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
23e50 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
23e60 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
23e70 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
23e80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23e90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
23ea0 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
23eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
23ec0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
23ed0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
23ee0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45    }..    if( !ME
23ef0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
23f00 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
23f10 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
23f20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
23f30 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
23f40 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
23f50 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
23f60 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
23f70 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
23f80 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
23f90 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
23fa0 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
23fb0 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65  .    ** persiste
23fc0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
23fd0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
23fe0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d  pPager, rc);.  }
23ff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24000 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
24010 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
24020 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
24030 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
24040 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
24050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24060 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
24070 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c  table..*/.u8 sql
24080 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
24090 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
240a0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
240b0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
240c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
240d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
240e0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
240f0 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
24100 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
24110 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
24120 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
24130 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
24140 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
24150 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
24160 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
24170 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
24180 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
24190 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
241a0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
241b0 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65  nt(DbPage *pPage
241c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
241d0 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
241e0 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a  count(pPage);.}.
241f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
24200 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
24210 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
24220 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
24230 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
24240 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
24250 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
24260 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
24270 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
24280 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  0] = sqlite3Pcac
24290 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
242a0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
242b0 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [1] = sqlite3Pca
242c0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
242d0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
242e0 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[2] = sqlite3P
242f0 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a  cacheGetCachesiz
24300 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
24310 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  e);.  a[3] = pPa
24320 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
24330 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d   ? (int) pPager-
24340 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20  >dbSize : -1;.  
24350 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
24360 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
24370 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
24380 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
24390 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
243a0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
243b0 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55   a[8] = 0;  /* U
243c0 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72  sed to be pPager
243d0 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39  ->nOvfl */.  a[9
243e0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
243f0 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
24400 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
24410 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73  eturn a;.}.int s
24420 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d  qlite3PagerIsMem
24430 64 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  db(Pager *pPager
24440 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44  ){.  return MEMD
24450 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B;.}.#endif../*.
24460 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
24470 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73  here are at leas
24480 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76  t nSavepoint sav
24490 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 0a 2a 2f  epoints open..*/
244a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
244b0 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50  rOpenSavepoint(P
244c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
244d0 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t nSavepoint){. 
244e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
244f0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 53 61 76  _OK;..  if( nSav
24500 65 70 6f 69 6e 74 3e 70 50 61 67 65 72 2d 3e 6e  epoint>pPager->n
24510 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 50 61  Savepoint && pPa
24520 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
24530 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  ){.    int ii;. 
24540 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
24550 74 20 2a 61 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a  t *aNew;..    /*
24560 20 45 69 74 68 65 72 20 74 68 65 20 73 75 62 2d   Either the sub-
24570 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
24580 6f 72 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  or there are no 
24590 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
245a0 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  s. */.    assert
245b0 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
245c0 6f 69 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 67 65  oint==0 || pPage
245d0 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  r->sjfd->pMethod
245e0 73 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f  s );..    /* Gro
245f0 77 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  w the Pager.aSav
24600 65 70 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69  epoint array usi
24610 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65  ng realloc(). Re
24620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
24630 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20  M.    ** if the 
24640 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
24650 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72  . Otherwise, zer
24660 6f 20 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f  o the new portio
24670 6e 20 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20  n in case a .   
24680 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   ** malloc failu
24690 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
246a0 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e  populating it in
246b0 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f   the for(...) lo
246c0 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  op below..    */
246d0 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67  .    aNew = (Pag
246e0 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71  erSavepoint *)sq
246f0 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
24700 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
24710 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66  avepoint, sizeof
24720 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29  (PagerSavepoint)
24730 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20  *nSavepoint.    
24740 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77  );.    if( !aNew
24750 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24760 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
24770 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
24780 26 61 4e 65 77 5b 70 50 61 67 65 72 2d 3e 6e 53  &aNew[pPager->nS
24790 61 76 65 70 6f 69 6e 74 5d 2c 20 30 2c 0a 20 20  avepoint], 0,.  
247a0 20 20 20 20 20 20 28 6e 53 61 76 65 70 6f 69 6e        (nSavepoin
247b0 74 20 2d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  t - pPager->nSav
247c0 65 70 6f 69 6e 74 29 20 2a 20 73 69 7a 65 6f 66  epoint) * sizeof
247d0 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29  (PagerSavepoint)
247e0 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 50 61 67  .    );.    pPag
247f0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
24800 20 61 4e 65 77 3b 0a 20 20 20 20 69 69 20 3d 20   aNew;.    ii = 
24810 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
24820 6e 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  nt;.    pPager->
24830 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61  nSavepoint = nSa
24840 76 65 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a  vepoint;..    /*
24850 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61   Populate the Pa
24860 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72  gerSavepoint str
24870 75 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c  uctures just all
24880 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66  ocated. */.    f
24890 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20  or(/* no-op */; 
248a0 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  ii<nSavepoint; i
248b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
248c0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
248d0 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20  zeValid );.     
248e0 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20   aNew[ii].nOrig 
248f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
24900 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
24910 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
24920 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
24930 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20  alOff>0 ){.     
24940 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66     aNew[ii].iOff
24950 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
24960 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
24970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
24980 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20  New[ii].iOffset 
24990 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
249a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
249b0 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  }.      aNew[ii]
249c0 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65  .iSubRec = pPage
249d0 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 20  r->stmtNRec;.   
249e0 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53     aNew[ii].pInS
249f0 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74  avepoint = sqlit
24a00 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
24a10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
24a20 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b        if( !aNew[
24a30 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
24a40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
24a50 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
24a60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
24a70 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
24a80 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
24a90 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
24aa0 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20  y opened. */.   
24ab0 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
24ac0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
24ad0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
24ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
24af0 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20  er op is always 
24b00 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
24b10 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56  _ROLLBACK or SAV
24b20 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a  EPOINT_RELEASE..
24b30 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41 56 45  ** If it is SAVE
24b40 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
24b50 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20  hen release and 
24b60 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65  destroy the save
24b70 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e  point with.** in
24b80 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  dex iSavepoint. 
24b90 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
24ba0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
24bb0 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  n rollback all c
24bc0 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68  hanges.** that h
24bd0 61 76 65 20 6f 63 63 75 72 65 64 20 73 69 6e 63  ave occured sinc
24be0 65 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76  e savepoint iSav
24bf0 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
24c00 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  ed..**.** In eit
24c10 68 65 72 20 63 61 73 65 2c 20 61 6c 6c 20 73 61  her case, all sa
24c20 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e  vepoints with an
24c30 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
24c40 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a  han iSavepoint .
24c50 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ** are destroyed
24c60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
24c70 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 28   are less than (
24c80 69 53 61 76 65 70 6f 69 6e 74 2b 31 29 20 61 63  iSavepoint+1) ac
24c90 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
24ca0 77 68 65 6e 20 74 68 69 73 20 0a 2a 2a 20 66 75  when this .** fu
24cb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24cc0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
24cd0 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  */ .int sqlite3P
24ce0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61  agerSavepoint(Pa
24cf0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
24d00 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
24d10 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
24d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
24d30 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
24d40 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
24d50 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
24d60 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28  LLBACK );..  if(
24d70 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67   iSavepoint<pPag
24d80 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  er->nSavepoint )
24d90 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  {.    int ii;.  
24da0 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 69 53 61    int nNew = iSa
24db0 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53  vepoint + (op==S
24dc0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
24dd0 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e  K);.    for(ii=n
24de0 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  New; ii<pPager->
24df0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
24e00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24e10 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
24e20 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
24e30 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
24e40 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
24e50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
24e60 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 69 66   = nNew;..    if
24e70 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
24e80 52 4f 4c 4c 42 41 43 4b 20 26 26 20 70 50 61 67  ROLLBACK && pPag
24e90 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
24ea0 73 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  s ){.      Pager
24eb0 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
24ec0 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30  point = (nNew==0
24ed0 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61  )?0:&pPager->aSa
24ee0 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b  vepoint[nNew-1];
24ef0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
24f00 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
24f10 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76 65  nt(pPager, pSave
24f20 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73  point);.      as
24f30 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f  sert(rc!=SQLITE_
24f40 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  DONE);.    }.  .
24f50 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
24f60 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74  s a release of t
24f70 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76  he outermost sav
24f80 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65  epoint, truncate
24f90 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
24fa0 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20  -journal. */.   
24fb0 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20   if( nNew==0 && 
24fc0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
24fd0 4c 45 41 53 45 20 26 26 20 70 50 61 67 65 72 2d  LEASE && pPager-
24fe0 3e 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  >sjfd->pMethods 
24ff0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25010 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
25020 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
25030 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b  Pager->sjfd, 0);
25040 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
25050 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
25060 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
25070 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
25080 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
25090 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
250a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
250b0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
250c0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
250d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
250e0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
250f0 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
25100 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25110 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f  VFS structure fo
25120 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  r the pager..*/.
25130 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66  const sqlite3_vf
25140 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56  s *sqlite3PagerV
25150 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  fs(Pager *pPager
25160 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
25170 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a  er->pVfs;.}../*.
25180 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
25190 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  le handle for th
251a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
251b0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
251c0 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  th the pager.  T
251d0 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  his might return
251e0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c   NULL if the fil
251f0 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74  e has.** not yet
25200 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f   been opened..*/
25210 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73  .sqlite3_file *s
25220 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
25230 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
25240 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
25250 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >fd;.}../*.** Re
25260 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
25270 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
25280 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
25290 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
252a0 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65  agerDirname(Page
252b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
252c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
252d0 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
252e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
252f0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
25300 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
25310 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
25320 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
25330 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
25340 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
25350 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
25360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
25370 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
25380 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
25390 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
253a0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
253b0 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
253c0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
253d0 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
253e0 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
253f0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
25400 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
25410 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
25420 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
25430 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
25440 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
25450 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
25460 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
25470 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
25480 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
25490 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
254a0 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
254b0 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
254c0 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
254d0 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
254e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
254f0 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
25500 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  g;.}.#endif..#if
25510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25520 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
25530 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
25540 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
25550 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
25560 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
25570 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
25580 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
25590 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
255a0 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
255b0 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
255c0 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
255d0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
255e0 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
255f0 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
25600 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
25610 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
25620 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
25630 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
25640 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
25650 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
25660 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
25670 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
25680 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
25690 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
256a0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
256b0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
256c0 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
256d0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
256e0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
256f0 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
25700 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
25710 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
25720 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
25730 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
25740 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
25750 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
25760 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25770 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
25780 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
25790 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
257a0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
257b0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
257c0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
257d0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
257e0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
257f0 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
25800 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
25810 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
25820 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
25830 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctive)..**.** If
25840 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
25850 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  ment, isCommit, 
25860 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
25870 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62  n this page is b
25880 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73  eing.** moved as
25890 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62   part of a datab
258a0 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69  ase reorganizati
258b0 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  on just before t
258c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
258d0 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  ** is being comm
258e0 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  itted. In this c
258f0 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61  ase, it is guara
25900 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
25910 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a  atabase page .**
25920 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77   pPg refers to w
25930 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
25940 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68  en to again with
25950 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
25960 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
25970 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
25980 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25990 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
259a0 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f  o pgno, int isCo
259b0 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  mmit){.  PgHdr *
259c0 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20  pPgOld;  /* The 
259d0 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77  page being overw
259e0 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e  ritten. */.  Pgn
259f0 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
25a00 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
25a10 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
25a20 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ef>0 );..  /* If
25a30 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
25a40 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79 20 61  moved is dirty a
25a50 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  nd has not been 
25a60 73 61 76 65 64 20 62 79 20 74 68 65 20 6c 61 74  saved by the lat
25a70 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69  est.  ** savepoi
25a80 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68  nt, then save th
25a90 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
25aa0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ts of the page i
25ab0 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75  nto the .  ** su
25ac0 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54  b-journal now. T
25ad0 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
25ae0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f  to handle the fo
25af0 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f  llowing scenario
25b00 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45  :.  **.  **   BE
25b10 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a  GIN;.  **     <j
25b20 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74  ournal page X, t
25b30 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e  hen modify it in
25b40 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20   memory>.  **   
25b50 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
25b60 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76  .  **       <Mov
25b70 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61  e page X to loca
25b80 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20  tion Y>.  **    
25b90 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65   ROLLBACK TO one
25ba0 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ;.  **.  ** If p
25bb0 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77  age X were not w
25bc0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75  ritten to the su
25bd0 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20  b-journal here, 
25be0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  it would not.  *
25bf0 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
25c00 20 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e   restore its con
25c10 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22  tents when the "
25c20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22  ROLLBACK TO one"
25c30 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
25c40 77 65 72 65 20 70 72 6f 63 65 73 73 65 64 2e 0a  were processed..
25c50 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
25c60 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
25c70 59 20 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71  Y .   && subjReq
25c80 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
25c90 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
25ca0 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c  (rc = subjournal
25cb0 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a  Page(pPg)).  ){.
25cc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
25cd0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
25ce0 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  (("MOVE %d page 
25cf0 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
25d00 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
25d10 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
25d20 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
25d30 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  no, (pPg->flags&
25d40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
25d50 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ?1:0, pgno));.  
25d60 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
25d70 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
25d80 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
25d90 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67  gno))..  pager_g
25da0 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
25db0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
25dc0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
25dd0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
25de0 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
25df0 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69   can.  ** be wri
25e00 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70  tten to, store p
25e10 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61  Pg->pgno in loca
25e20 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53  l variable needS
25e30 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20  yncPgno..  **.  
25e40 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d  ** If the isComm
25e50 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  it flag is set, 
25e60 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
25e70 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
25e80 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
25e90 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
25ea0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
25eb0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67  atabase page pPg
25ec0 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e  ->pgno .  ** can
25ed0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
25ee0 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
25ef0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
25f00 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
25f10 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
25f20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
25f30 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21  _NEED_SYNC) && !
25f40 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
25f50 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
25f60 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
25f70 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
25f80 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
25f90 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
25fa0 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
25fb0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
25fc0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
25fd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
25fe0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
25ff0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
26000 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
26010 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
26020 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
26030 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
26040 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61  rom its hash cha
26050 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
26060 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
26070 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
26080 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
26090 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
260a0 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
260b0 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
260c0 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
260d0 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
260e0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
260f0 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
26100 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64  D_SYNC;.  pPgOld
26110 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
26120 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
26130 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64   assert( !pPgOld
26140 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66   || pPgOld->nRef
26150 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==1 );.  if( pPg
26160 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  Old ){.    pPg->
26170 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64  flags |= (pPgOld
26180 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
26190 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a 20  ED_SYNC);.  }.. 
261a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f   sqlite3PcacheMo
261b0 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  ve(pPg, pgno);. 
261c0 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
261d0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
261e0 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20  Drop(pPgOld);.  
261f0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  }..  sqlite3Pcac
26200 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
26210 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74  ;.  pPager->dirt
26220 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 70 50  yCache = 1;.  pP
26230 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
26240 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
26250 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
26260 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
26270 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
26280 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
26290 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
262a0 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
262b0 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
262c0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
262d0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
262e0 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
262f0 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
26300 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
26310 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
26320 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
26330 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a  he .    ** "is j
26340 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63  ournaled" bitvec
26350 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73   flag has been s
26360 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74  et. This needs t
26370 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79  o be remedied by
26380 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20  .    ** loading 
26390 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
263a0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
263b0 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  d setting the Pg
263c0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20  Hdr.needSync .  
263d0 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a    ** flag..    *
263e0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
263f0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
26400 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
26410 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69  e page-cache fai
26420 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20  ls, (due.    ** 
26430 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  to a malloc() or
26440 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c   IO failure), cl
26450 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74  ear the bit in t
26460 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a  he pInJournal[].
26470 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74      ** array. Ot
26480 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
26490 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61  page is loaded a
264a0 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e  nd written again
264b0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   in.    ** this 
264c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
264d0 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74  may be written t
264e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
264f0 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ile before.    *
26500 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69  * it is synced i
26510 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
26520 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20  file. This way, 
26530 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e  it may end up in
26540 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
26550 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20  nal file twice, 
26560 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  but that is not 
26570 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a  a problem..    *
26580 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
26590 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63  ite3PagerGet() c
265a0 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68  all may cause th
265b0 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e  e journal to syn
265c0 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  c. So make.    *
265d0 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72  * sure the Pager
265e0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
265f0 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a  s set too..    *
26600 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  /.    PgHdr *pPg
26610 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Hdr;.    assert(
26620 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
26630 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
26640 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
26650 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
26660 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20  no, &pPgHdr);.  
26670 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26680 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
26690 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
266a0 6e 61 6c 20 26 26 20 6e 65 65 64 53 79 6e 63 50  nal && needSyncP
266b0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
266c0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
266d0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
266e0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49  Clear(pPager->pI
266f0 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79  nJournal, needSy
26700 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ncPgno);.      }
26710 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
26720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
26730 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
26740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
26750 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
26760 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  && !MEMDB );.   
26770 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c   pPgHdr->flags |
26780 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
26790 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  C;.    sqlite3Pc
267a0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
267b0 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
267c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
267d0 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Hdr);.  }..  ret
267e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
267f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
26800 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
26810 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
26820 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
26830 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
26840 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
26850 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
26860 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
26870 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ef>0 || pPg->pPa
26880 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20  ger->memDb );.  
26890 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74  return pPg->pDat
268a0 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
268b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
268c0 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
268d0 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
268e0 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
268f0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
26900 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
26910 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
26920 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
26930 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
26940 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26950 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
26960 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
26970 3f 70 50 67 2d 3e 70 45 78 74 72 61 3a 30 29 3b  ?pPg->pExtra:0);
26980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
26990 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
269a0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
269b0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
269c0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
269d0 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
269e0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
269f0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
26a00 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
26a10 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
26a20 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
26a30 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
26a40 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
26a50 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
26a60 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
26a70 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
26a80 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
26a90 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
26aa0 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
26ab0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
26ac0 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
26ad0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
26ae0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
26af0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
26b00 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
26b10 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
26b20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
26b30 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
26b40 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
26b50 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
26b60 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
26b70 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
26b80 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
26b90 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
26ba0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
26bb0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
26bc0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
26bd0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
26be0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
26bf0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
26c00 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
26c10 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
26c20 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
26c30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
26c40 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
26c50 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
26c60 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
26c70 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
26c80 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
26c90 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  veMode = (u8)eMo
26ca0 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
26cb0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
26cc0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
26cd0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
26ce0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66  e journal-mode f
26cf0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
26d00 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
26d10 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a  ust be one of:.*
26d20 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  *.**    PAGER_JO
26d30 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
26d40 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
26d50 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a  NALMODE_DELETE.*
26d60 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
26d70 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
26d80 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
26d90 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
26da0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
26db0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 0a 2a  NALMODE_OFF.**.*
26dc0 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  * If the paramet
26dd0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
26de0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
26df0 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  al-mode is set t
26e00 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73  o the.** value s
26e10 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
26e20 54 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64  The returned ind
26e30 69 63 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  icate the curren
26e40 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
26e50 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  ted).** journal-
26e60 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
26e70 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
26e80 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
26e90 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
26ea0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
26eb0 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64      assert( eMod
26ec0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
26ed0 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
26ee0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
26ef0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
26f00 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
26f10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
26f20 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
26f30 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
26f40 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
26f50 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
26f60 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
26f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
26f80 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
26f90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
26fb0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
26fc0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
26fd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26fe0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26ff0 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 20  E_QUERY<0 );.   
27000 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b   if( eMode>=0 ){
27010 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
27020 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38  ournalMode = (u8
27030 29 65 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73  )eMode;.    }els
27040 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
27050 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
27060 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20  URNALMODE_QUERY 
27070 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
27080 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
27090 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
270a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
270b0 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
270c0 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
270d0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
270e0 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  s..*/.i64 sqlite
270f0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
27100 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  eLimit(Pager *pP
27110 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74  ager, i64 iLimit
27120 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  ){.  if( iLimit>
27130 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =-1 ){.    pPage
27140 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
27150 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20  mit = iLimit;.  
27160 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
27170 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
27180 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  mit;.}..#endif /
27190 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
271a0 53 4b 49 4f 20 2a 2f 0a                          SKIO */.