/ Hex Artifact Content
Login

Artifact 1df277b7c78f780df119c9e2ddea6690979489c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 37  : pager.c,v 1.57
0350: 38 20 32 30 30 39 2f 30 34 2f 30 35 20 31 32 3a  8 2009/04/05 12:
0360: 32 32 3a 30 39 20 64 72 68 20 45 78 70 20 24 0a  22:09 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
03f0: 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b 20 20  3PagerTrace=1;  
0400: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
0410: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 64 65  e tracing */.#de
0420: 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75  fine sqlite3Debu
0430: 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a 23  gPrintf printf.#
0440: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0450: 45 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c  E(X)     if( sql
0460: 69 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29  ite3PagerTrace )
0470: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
0480: 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73 65 0a  intf X; }.#else.
0490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04a0: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
04b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
04c0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
04d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
04e0: 20 50 41 47 45 52 54 52 41 43 45 28 29 20 6d 61   PAGERTRACE() ma
04f0: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0500: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0510: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0520: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0530: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0540: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
0550: 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e  as its argument.
0560: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0570: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0580: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0590: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
05a0: 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f  akes an sqlite3_
05b0: 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  file.** struct a
05c0: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a  s its argument..
05d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
05e0: 49 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e  ID(p) ((int)(p->
05f0: 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c  fd)).#define FIL
0600: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28  EHANDLEID(fd) ((
0610: 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54  int)fd)../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0870: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0880: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0890: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  for writing.**  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74       but has not
08c0: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
08d0: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
08e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0910: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0920: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0930: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0950: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0960: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0970: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
09a0: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
09b0: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
09e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
09f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0a00: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0a10: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0a20: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0a50: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0a60: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a80: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0a90: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0aa0: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0ab0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0ad0: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0af0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0b00: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0b10: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0b30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b40: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0b50: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0ba0: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0bb0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0bc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bd0: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0be0: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0bf0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0c00: 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  e or.**         
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0c20: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
0c70: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0c80: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0c90: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0ca0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0cb0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0cc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0d90: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0da0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0db0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0dc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0dd0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0de0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0df0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0e00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0e10: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0e20: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0e30: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0e40: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0e50: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0e60: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e70: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0e80: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0e90: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
0ea0: 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c   is an open roll
0eb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
0ec0: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0ed0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0ee0: 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65  VE occurs before
0ef0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
0f00: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
0f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
0f20: 68 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20  hough writes to 
0f30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
0f40: 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77  journal occurs w
0f50: 69 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52  ith just PAGER_R
0f60: 45 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20  ESERVED.  After 
0f70: 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  an sqlite3PagerR
0f80: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
0f90: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
0fa0: 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68  itPhaseTwo(), th
0fb0: 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62  e state can go b
0fc0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
0fd0: 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61  RED,.** or it ca
0fe0: 6e 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f  n stay at PAGER_
0ff0: 45 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20  EXCLUSIVE if we 
1000: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
1010: 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f   access mode..*/
1020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
1030: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
1040: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
1050: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
1060: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
1070: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1080: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1090: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
10a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
10b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
10c0: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
10d0: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
10e0: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
10f0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1100: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d      5../*.** A m
1110: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1120: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1130: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1140: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1150: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1160: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1170: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
1180: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
1190: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
11a0: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
11b0: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
11c0: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
11d0: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
11e0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
11f0: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
1200: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
1210: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
1220: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
1230: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
1240: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
1250: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
1260: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74  mum allowed sect
1270: 6f 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49  or size. 16MB. I
1280: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
1290: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
12a0: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
12b0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
12c0: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
12d0: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
12e0: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
12f0: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
1300: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
1310: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
1320: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
1330: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
1340: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
1350: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
1360: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
1370: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
1380: 53 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a 0a  SIZE 0x0100000..
1390: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
13a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
13b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
13c0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
13d0: 63 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76  ch active.** sav
13e0: 65 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65  epoint and state
13f0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1400: 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20   in the system. 
1410: 41 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75  All such structu
1420: 72 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  res.** are store
1430: 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  d in the Pager.a
1440: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
1450: 79 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f  y, which is allo
1460: 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73  cated and.** res
1470: 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ized using sqlit
1480: 65 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a  e3Realloc()..**.
1490: 2a 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  ** When a savepo
14a0: 69 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c 20  int is created, 
14b0: 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
14c0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
14d0: 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  eld is.** set to
14e0: 20 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   0. If a journal
14f0: 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
1500: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  en into the main
1510: 20 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a   journal while.*
1520: 2a 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * the savepoint 
1530: 69 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20  is active, then 
1540: 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  iHdrOffset is se
1550: 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66  t to the byte of
1560: 66 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61  fset .** immedia
1570: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
1580: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20  he last journal 
1590: 72 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69  record written i
15a0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  nto the main.** 
15b0: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74  journal before t
15c0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
15d0: 72 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  r. This is requi
15e0: 72 65 64 20 64 75 72 69 6e 67 20 73 61 76 65 70  red during savep
15f0: 6f 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  oint.** rollback
1600: 20 28 73 65 65 20 70 61 67 65 72 50 6c 61 79 62   (see pagerPlayb
1610: 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e  ackSavepoint()).
1620: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1630: 63 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ct PagerSavepoin
1640: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1650: 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 53 61  ;.struct PagerSa
1660: 76 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20  vepoint {.  i64 
1670: 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  iOffset;        
1680: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
1690: 74 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d  ting offset in m
16a0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
16b0: 20 69 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b   i64 iHdrOffset;
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d0: 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20   See above */.  
16e0: 42 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70  Bitvec *pInSavep
16f0: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  oint;        /* 
1700: 53 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  Set of pages in 
1710: 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a  this savepoint *
1720: 2f 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20  /.  Pgno nOrig; 
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d   /* Original num
1750: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1760: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  file */.  Pgno i
1770: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
1780: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1790: 6f 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 20  of first record 
17a0: 69 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  in sub-journal *
17b0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  /.};../*.** A op
17c0: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
17d0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
17e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
17f0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65  ructure..**.** e
1800: 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50  rrCode.**.**   P
1810: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79  ager.errCode may
1820: 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
1830: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
1840: 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20  CORRUPT, or.**  
1850: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e   or SQLITE_FULL.
1860: 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65   Once one of the
1870: 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72   first three err
1880: 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70  ors occurs, it p
1890: 65 72 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64  ersists.**   and
18a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
18b0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76  the result of ev
18c0: 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20  ery major pager 
18d0: 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a  API call.  The.*
18e0: 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  *   SQLITE_FULL 
18f0: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
1900: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
1910: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
1920: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
1930: 20 20 20 6e 65 78 74 20 73 75 63 63 65 73 73 66     next successf
1940: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
1950: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
1960: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
1970: 6f 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46  o,.**   SQLITE_F
1980: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
1990: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
19a0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
19b0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
19c0: 28 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68  ().**   APIs, th
19d0: 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ey may still be 
19e0: 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  used successfull
19f0: 79 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56  y..**.** dbSizeV
1a00: 61 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62  alid, dbSize, db
1a10: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
1a20: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e  Size.**.**   Man
1a30: 61 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f  aging the size o
1a40: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a50: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73 20  ile in pages is 
1a60: 61 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63  a little complic
1a70: 61 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76  ated..**   The v
1a80: 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62  ariable Pager.db
1a90: 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Size contains th
1aa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1ab0: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
1ac0: 61 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63  ase.**   image c
1ad0: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
1ae0: 73 2e 20 41 73 20 74 68 65 20 64 61 74 61 62 61  s. As the databa
1af0: 73 65 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f  se image grows o
1b00: 72 20 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a  r shrinks this.*
1b10: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 69 73 20  *   variable is 
1b20: 75 70 64 61 74 65 64 2e 20 54 68 65 20 76 61 72  updated. The var
1b30: 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69  iable Pager.dbFi
1b40: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
1b50: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  the number.**   
1b60: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1b80: 68 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65  his may be diffe
1b90: 72 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e  rent from Pager.
1ba0: 64 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73  dbSize.**   if s
1bb0: 6f 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62  ome pages have b
1bc0: 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20  een appended to 
1bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
1be0: 67 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77  ge but not yet w
1bf0: 72 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20  ritten.**   out 
1c00: 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74  from the cache t
1c10: 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  o the actual fil
1c20: 65 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66  e on disk. Or if
1c30: 20 74 68 65 20 69 6d 61 67 65 20 68 61 73 20 62   the image has b
1c40: 65 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74  een.**   truncat
1c50: 65 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65  ed by an increme
1c60: 6e 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72  ntal-vacuum oper
1c70: 61 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72  ation. The Pager
1c80: 2e 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69  .dbOrigSize vari
1c90: 61 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69  able.**   contai
1ca0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1cb0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1cc0: 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 68 65  tabase image whe
1cd0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
1ce0: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77     transaction w
1cf0: 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63  as opened. The c
1d00: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74  ontents of all t
1d10: 68 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61  hree of these va
1d20: 72 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20  riables is.**   
1d30: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20  only guaranteed 
1d40: 74 6f 20 62 65 20 63 6f 72 72 65 63 74 20 69 66  to be correct if
1d50: 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67   the boolean Pag
1d60: 65 72 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69  er.dbSizeValid i
1d70: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  s true..**.**   
1d80: 54 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74  TODO: Under what
1d90: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64   conditions is d
1da0: 62 53 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20  bSizeValid set? 
1db0: 43 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63  Cleared?.**.** c
1dc0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a  hangeCountDone.*
1dd0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c  *.**   This bool
1de0: 65 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20  ean variable is 
1df0: 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
1e00: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 67  e that the chang
1e10: 65 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20  e-counter .**   
1e20: 28 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64  (the 4-byte head
1e30: 65 72 20 66 69 65 6c 64 20 61 74 20 62 79 74 65  er field at byte
1e40: 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
1e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1e60: 20 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70   is .**   not up
1e70: 64 61 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e  dated more often
1e80: 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e   than necessary.
1e90: 20 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20   .**.**   It is 
1ea0: 73 65 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e  set to true when
1eb0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1ec0: 74 65 72 20 66 69 65 6c 64 20 69 73 20 75 70 64  ter field is upd
1ed0: 61 74 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20  ated, which .** 
1ee0: 20 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65    can only happe
1ef0: 6e 20 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76  n if an exclusiv
1f00: 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
1f10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1f20: 69 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20  ile..**   It is 
1f30: 63 6c 65 61 72 65 64 20 28 73 65 74 20 74 6f 20  cleared (set to 
1f40: 66 61 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20  false) whenever 
1f50: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1f60: 6b 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e  k is .**   relin
1f70: 71 75 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64  quished on the d
1f80: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61  atabase file. Ea
1f90: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
1fa0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
1fb0: 65 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61  ed,.**   The cha
1fc0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1fd0: 67 20 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20  g is inspected. 
1fe0: 49 66 20 69 74 20 69 73 20 74 72 75 65 2c 20 74  If it is true, t
1ff0: 68 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20  he work of.**   
2000: 75 70 64 61 74 69 6e 67 20 74 68 65 20 63 68 61  updating the cha
2010: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f  nge-counter is o
2020: 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 20 63  mitted for the c
2030: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2040: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  on..**.**   This
2050: 20 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73   mechanism means
2060: 20 74 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69   that when runni
2070: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
2080: 6d 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69  mode, a connecti
2090: 6f 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e  on .**   need on
20a0: 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ly update the ch
20b0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63  ange-counter onc
20c0: 65 2c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  e, for the first
20d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
20e0: 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a    committed..**.
20f0: 2a 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a  ** dbModified.**
2100: 0a 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69  .**   The dbModi
2110: 66 69 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  fied flag is set
2120: 20 77 68 65 6e 65 76 65 72 20 61 20 64 61 74 61   whenever a data
2130: 62 61 73 65 20 70 61 67 65 20 69 73 20 64 69 72  base page is dir
2140: 74 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73  tied..**   It is
2150: 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 65 20   cleared at the 
2160: 65 6e 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e  end of each tran
2170: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2180: 20 49 74 20 69 73 20 75 73 65 64 20 77 68 65 6e   It is used when
2190: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f   committing or o
21a0: 74 68 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20  therwise ending 
21b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
21c0: 66 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64  f.**   the dbMod
21d0: 69 66 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c  ified flag is cl
21e0: 65 61 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f  ear then less wo
21f0: 72 6b 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e  rk has to be don
2200: 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e..**.** journal
2210: 53 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20  Started.**.**   
2220: 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74  This flag is set
2230: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68   whenever the th
2240: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  e main journal i
2250: 73 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  s synced. .**.**
2260: 20 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20     The point of 
2270: 74 68 69 73 20 66 6c 61 67 20 69 73 20 74 68 61  this flag is tha
2280: 74 20 69 74 20 6d 75 73 74 20 62 65 20 73 65 74  t it must be set
2290: 20 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20   after the .**  
22a0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
22b0: 65 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e  eader in a journ
22c0: 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
22d0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
22e0: 0a 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69 73  .**   After this
22f0: 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e   has happened, n
2300: 65 77 20 70 61 67 65 73 20 61 70 70 65 6e 64 65  ew pages appende
2310: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2320: 65 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e  e .**   do not n
2330: 65 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45  eed the PGHDR_NE
2340: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74  ED_SYNC flag set
2350: 2c 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74  , as they do not
2360: 20 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61   need.**   to wa
2370: 69 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c  it for a journal
2380: 20 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65   sync before the
2390: 79 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  y can be written
23a0: 20 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65   out to.**   the
23b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
23c0: 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67  see function pag
23d0: 65 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20  er_write())..** 
23e0: 20 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a    .** setMaster.
23f0: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72  **.**   This var
2400: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2410: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
2420: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2430: 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28  file name.**   (
2440: 69 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20  if any) is only 
2450: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
2470: 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ce..**.**   When
2480: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
2490: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d  ansaction, the m
24a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
24b0: 6c 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29  le name (if any)
24c0: 0a 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69  .**   may be wri
24d0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
24e0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65  urnal file while
24f0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74   the pager is st
2500: 69 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45  ill in.**   PAGE
2510: 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2520: 20 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73   (see CommitPhas
2530: 65 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61  eOne() for the a
2540: 63 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20  ction). It.**   
2550: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  then attempts to
2560: 20 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65   upgrade to an e
2570: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49  xclusive lock. I
2580: 66 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a  f this attempt.*
2590: 2a 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  *   fails, then 
25a0: 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20  SQLITE_BUSY may 
25b0: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  be returned to t
25c0: 68 65 20 75 73 65 72 20 61 6e 64 20 74 68 65 20  he user and the 
25d0: 75 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74  user.**   may at
25e0: 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20  tempt to commit 
25f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2600: 61 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c  again later (cal
2610: 6c 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74  ling.**   Commit
2620: 50 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e  PhaseOne() again
2630: 29 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73 20  ). This flag is 
2640: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
2650: 68 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61  hat the .**   ma
2660: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
2670: 65 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65  e is only writte
2680: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2690: 20 66 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a   file the first.
26a0: 2a 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74  **   time Commit
26b0: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
26c0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f  lled..**.** doNo
26d0: 74 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tSync.**.**   Th
26e0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  is variable is s
26f0: 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  et and cleared b
2700: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
2710: 69 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65  ite()..**.** nee
2720: 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  dSync.**.**   TO
2730: 44 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20  DO: It might be 
2740: 65 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68  easier to set th
2750: 69 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77  is variable in w
2760: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
2770: 0a 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d  .**   and writeM
2780: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f  asterJournal() o
2790: 6e 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20  nly. Change its 
27a0: 6d 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79  meaning to "unsy
27b0: 6e 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68  nced data.**   h
27c0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
27d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e  to the journal".
27e0: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
27f0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
2800: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
2810: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
2820: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
2830: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
2840: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
2850: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
2860: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
2870: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
2880: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a0: 4f 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  On of the PAGER_
28b0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61  JOURNALMODE_* va
28c0: 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65  lues */.  u8 use
28d0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
28e0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
28f0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
2900: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
2910: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2930: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
2940: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
2950: 6b 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ks */.  u8 noSyn
2960: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2970: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
2980: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
2990: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
29a0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
29b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
29c0: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
29d0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
29e0: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
29f0: 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20  sync_flags;     
2a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2a10: 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  of SYNC_NORMAL o
2a20: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20  r SYNC_FULL */. 
2a30: 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20   u8 tempFile;   
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a50: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74  zFilename is a t
2a60: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f  emporary file */
2a70: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a90: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
2aa0: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
2ab0: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
2ae0: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
2af0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   */..  /* The fo
2b00: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
2b10: 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61  ntains those cla
2b20: 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20  ss members that 
2b30: 61 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a  are dynamically.
2b40: 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75    ** modified du
2b50: 72 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  ring normal oper
2b60: 61 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65  ations. The othe
2b70: 72 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  r variables in t
2b80: 68 69 73 20 73 74 72 75 63 74 75 72 65 0a 20 20  his structure.  
2b90: 2a 2a 20 61 72 65 20 65 69 74 68 65 72 20 63 6f  ** are either co
2ba0: 6e 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75  nstant throughou
2bb0: 74 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f  t the lifetime o
2bc0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20  f the pager, or 
2bd0: 65 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74  else.  ** used t
2be0: 6f 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72  o store configur
2bf0: 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73  ation parameters
2c00: 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
2c10: 20 77 61 79 20 74 68 65 20 70 61 67 65 72 20 0a   way the pager .
2c20: 20 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20    ** operates.. 
2c30: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74   **.  ** The 'st
2c40: 61 74 65 27 20 76 61 72 69 61 62 6c 65 20 69 73  ate' variable is
2c50: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f   described in mo
2c60: 72 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20  re detail along 
2c70: 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65  with the.  ** de
2c80: 73 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68  scriptions of th
2c90: 65 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20  e values it may 
2ca0: 74 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c  take - PAGER_UNL
2cb0: 4f 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66  OCK etc. Many of
2cc0: 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
2cd0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69  variables in thi
2ce0: 73 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63  s block are desc
2cf0: 72 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d  ribed in the com
2d00: 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20  ment directly . 
2d10: 20 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63   ** above this c
2d20: 6c 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  lass definition.
2d30: 0a 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  .  */.  u8 state
2d40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d50: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
2d60: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
2d70: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
2d80: 0a 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64  .  u8 dbModified
2d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2da0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
2db0: 61 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  are any changes 
2dc0: 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75  to the Db */.  u
2dd0: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
2de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2df0: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
2e00: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
2e10: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2e20: 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  8 journalStarted
2e30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
2e40: 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20  ue if header of 
2e50: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
2e60: 64 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  d */.  u8 change
2e70: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
2e80: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
2e90: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
2ea0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2eb0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
2ec0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2ed0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
2ee0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
2ef0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
2f00: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e  */.  u8 doNotSyn
2f10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f20: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69   /* Boolean. Whi
2f30: 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20  le true, do not 
2f40: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
2f50: 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61  */.  u8 dbSizeVa
2f60: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
2f70: 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53   /* Set when dbS
2f80: 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a  ize is correct *
2f90: 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b  /.  Pgno dbSize;
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2fc0: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
2fd0: 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f  se */.  Pgno dbO
2fe0: 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rigSize;        
2ff0: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
3000: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
3010: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
3020: 20 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a    Pgno dbFileSiz
3030: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3040: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3050: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3060: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65   file */.  int e
3070: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
3080: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
3090: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
30a0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
30b0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
30c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
30d0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
30e0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
30f0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
3100: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
3110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
3120: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
3130: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
3140: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
3150: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
3160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3170: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
3180: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
3190: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
31a0: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
31b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
31c0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
31d0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
31e0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
31f0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
3200: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
3210: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
3220: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
3230: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
3240: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
3250: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
3260: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
3270: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
3280: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
3290: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
32a0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
32b0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
32c0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
32d0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
32e0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
32f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
3300: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3320: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
3330: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
3340: 68 65 61 64 65 72 20 2a 2f 0a 20 20 50 61 67 65  header */.  Page
3350: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
3360: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
3370: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
3380: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
3390: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
33a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
33c0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
33d0: 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
33e0: 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a  s[16];        /*
33f0: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
3400: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
3410: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32  changes */.  u32
3420: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
3430: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
3440: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
3450: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
3460: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  */..  int nExtra
3470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3480: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
3490: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
34a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
34b0: 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67  */.  u32 vfsFlag
34c0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
34d0: 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71   /* Flags for sq
34e0: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
34f0: 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  ) */.  int pageS
3500: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3510: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3520: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
3530: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
3540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3550: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
3560: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
3570: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
3580: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
3590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
35a0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
35b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
35c0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
35d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
35e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
35f0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ile */.  int (*x
3600: 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
3610: 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  d*); /* Function
3620: 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75   to call when bu
3630: 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  sy */.  void *pB
3640: 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20  usyHandlerArg;  
3650: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61      /* Context a
3660: 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73  rgument for xBus
3670: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64  yHandler */.#ifd
3680: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
3690: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
36a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
36b0: 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d  Cache hits and m
36c0: 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  issing */.  int 
36d0: 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20  nRead, nWrite;  
36e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
36f0: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77  ase pages read/w
3700: 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  ritten */.#endif
3710: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
3720: 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f  ter)(DbPage*); /
3730: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
3740: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
3750: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
3760: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
3770: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
3780: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
3790: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
37a0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
37b0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
37c0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
37d0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g;            /*
37e0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
37f0: 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23  to xCodec() */.#
3800: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
3810: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
3820: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
3830: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
3840: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
3850: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3860: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
3870: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
3880: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
3890: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
38a0: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
38b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
38c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
38d0: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
38e0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
38f0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
3900: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
3910: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
3920: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
3930: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
3940: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
3950: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
3960: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
3970: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
3980: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
3990: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
39a0: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
39b0: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
39c0: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
39d0: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
39e0: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
39f0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3a00: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
3a10: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
3a20: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
3a30: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
3a40: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
3a50: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3a60: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
3a70: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
3a80: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
3a90: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
3aa0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3ab0: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
3ac0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
3ad0: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
3ae0: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
3af0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
3b00: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
3b10: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
3b20: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
3b30: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
3b40: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
3b50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3b60: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
3b70: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
3b80: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
3b90: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
3ba0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
3bb0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
3bc0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
3bd0: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
3be0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
3bf0: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
3c00: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
3c10: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
3c20: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
3c30: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
3c40: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
3c50: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
3c60: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
3c70: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
3c80: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
3c90: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
3ca0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
3cb0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
3cc0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
3cd0: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
3ce0: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
3cf0: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
3d00: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
3d10: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
3d20: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
3d30: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
3d40: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
3d50: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
3d60: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
3d70: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
3d80: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
3d90: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
3da0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
3db0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
3dc0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
3dd0: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
3de0: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
3df0: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
3e00: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
3e10: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
3e20: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
3e30: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
3e40: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
3e50: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
3e60: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
3e70: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
3e80: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
3e90: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
3ea0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
3eb0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
3ec0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
3ed0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
3ee0: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
3ef0: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
3f00: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
3f10: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
3f20: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
3f30: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
3f40: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
3f50: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
3f60: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
3f70: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
3f80: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
3f90: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
3fa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
3fb0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
3fc0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
3fd0: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
3fe0: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
3ff0: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
4000: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
4010: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
4020: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
4030: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
4040: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
4050: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4060: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
4070: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
4080: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
4090: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
40a0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
40b0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
40c0: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
40d0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
40e0: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
40f0: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
4100: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
4110: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
4120: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
4130: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
4140: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
4150: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
4160: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
4170: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
4180: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
4190: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
41a0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
41b0: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
41c0: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
41d0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
41e0: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
41f0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
4200: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
4210: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
4220: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
4230: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
4240: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
4250: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
4260: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
4270: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
4280: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
4290: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
42a0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
42b0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
42c0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
42d0: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
42e0: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
42f0: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
4300: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
4310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
4320: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
4330: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
4340: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
4350: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
4360: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4370: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
4380: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
4390: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
43a0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
43b0: 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66  7483647..#ifndef
43c0: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
43d0: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
43e0: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
43f0: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
4400: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
4410: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
4420: 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
4430: 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d  er){..  /* A tem
4440: 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  p-file is always
4450: 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
4460: 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e  IVE or PAGER_SYN
4470: 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  CED state. */.  
4480: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
4490: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
44a0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
44b0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
44c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
44d0: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
44e0: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f  is always set fo
44f0: 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a  r temp-files */.
4500: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
4510: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
4520: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
4530: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72  ountDone );..  r
4540: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
4550: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
4560: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
4570: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
4580: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
4590: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
45a0: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
45b0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
45c0: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
45d0: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
45e0: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
45f0: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
4600: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
4610: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
4620: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
4630: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
4640: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4650: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
4660: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
4670: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
4680: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
4690: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
46a0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
46b0: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
46c0: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
46d0: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
46e0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
46f0: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4700: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
4710: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
4720: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4730: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
4740: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
4750: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
4760: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
4770: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
4780: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
4790: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
47a0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
47b0: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
47c0: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
47d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
47e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4800: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
4810: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
4820: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
4830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4840: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
4850: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
4860: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
4870: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
4880: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
4890: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
48a0: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
48b0: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
48c0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
48d0: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
48e0: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
48f0: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4900: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4910: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4920: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4930: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4940: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4950: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4960: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4970: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4980: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4990: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
49a0: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
49b0: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
49c0: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
49d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
49e0: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
49f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4a00: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
4a10: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
4a20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4a30: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4a40: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
4a50: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
4a60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4a70: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4a80: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
4a90: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
4aa0: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
4ab0: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
4ac0: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
4ad0: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
4ae0: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
4af0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4b00: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
4b10: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4b20: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
4b30: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
4b40: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
4b50: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4b60: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4b70: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
4b80: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
4b90: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
4ba0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
4bb0: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4bc0: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4bd0: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4be0: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4bf0: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
4c00: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  et);.}../*.** Th
4c10: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
4c20: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
4c30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
4c40: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
4c50: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
4c60: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
4c70: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
4c80: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
4c90: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
4ca0: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
4cb0: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
4cc0: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
4cd0: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
4ce0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
4cf0: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
4d00: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
4d10: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
4d20: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
4d30: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
4d40: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
4d50: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ds)../*.** If fi
4d60: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
4d70: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
4d80: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
4d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
4da0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
4db0: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
4dc0: 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  k){.  if( !isOpe
4dd0: 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65  n(pFd) ){.    re
4de0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4df0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
4e00: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
4e10: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
4e20: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4e30: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
4e40: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
4e50: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
4e60: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
4e70: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
4e80: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
4e90: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
4ea0: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
4eb0: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
4ec0: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
4ed0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
4ee0: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
4ef0: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
4f00: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
4f10: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
4f20: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
4f30: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
4f40: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
4f50: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
4f60: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
4f70: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
4f80: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
4f90: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
4fa0: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
4fb0: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
4fc0: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
4fd0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
4fe0: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
4ff0: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
5000: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
5010: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
5020: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
5030: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
5040: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
5050: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
5060: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
5070: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
5080: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
5090: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
50a0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
50b0: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
50c0: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
50d0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
50e0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
50f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
5100: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
5110: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
5120: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
5130: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
5140: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
5150: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
5160: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
5190: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
51a0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
51b0: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
51c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
51d0: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
51e0: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
5210: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
5220: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
5230: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
5240: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
5250: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
5260: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
5270: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
5280: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
5290: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
52a0: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
52b0: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
52c0: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
52d0: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
52e0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
52f0: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
5300: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
5310: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
5320: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
5330: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
5340: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
5350: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
5360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
5370: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
5380: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
5390: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
53a0: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
53b0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
53c0: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
53d0: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
53e0: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
53f0: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
5400: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
5410: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
5420: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
5430: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
5440: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
5450: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
5460: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
5470: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
5480: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
5490: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
54a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
54b0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
54c0: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
54d0: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
54e0: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
54f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5500: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
5510: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
5520: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
5530: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
5540: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
5550: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
5560: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
5570: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
5580: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
5590: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
55a0: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
55b0: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
55c0: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
55d0: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
55e0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
55f0: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
5600: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
5610: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
5620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
5630: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
5640: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
5650: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
5660: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
5670: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
5680: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
5690: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
56a0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
56b0: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
56c0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
56d0: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
56e0: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
56f0: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
5700: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
5710: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
5720: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
5730: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
5740: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
5750: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
5760: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
5770: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
5780: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
5790: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
57a0: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
57b0: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
57c0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
57d0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
57e0: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
57f0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
5800: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
5810: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
5820: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
5830: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5840: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
5850: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
5860: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
5870: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
5880: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
5890: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
58a0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
58b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
58c0: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
58d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
58e0: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
58f0: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
5900: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
5910: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
5920: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
5930: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
5940: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
5950: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
5960: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
5970: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
5980: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
5990: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
59a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
59b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
59c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
59d0: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
59e0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
59f0: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
5a00: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
5a10: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
5a20: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
5a30: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
5a40: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
5a50: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
5a60: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
5a70: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
5a80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5a90: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
5aa0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
5ab0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
5ac0: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
5ad0: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
5ae0: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
5af0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
5b00: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
5b10: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
5b20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5b30: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
5b40: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
5b50: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
5b60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5b70: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5b80: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
5b90: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
5ba0: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
5bb0: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
5bc0: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
5bd0: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
5be0: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
5bf0: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
5c00: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
5c10: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
5c20: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
5c30: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
5c40: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
5c50: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
5c60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5c70: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5c80: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
5c90: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
5ca0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5cb0: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
5cc0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
5cd0: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
5ce0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
5cf0: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
5d00: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
5d10: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5d20: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5d30: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
5d40: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
5d50: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
5d60: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
5d70: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
5d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
5d90: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
5da0: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
5db0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
5dc0: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
5dd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5de0: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
5e10: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
5e20: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
5e30: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5e50: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
5e60: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
5e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
5e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5e90: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
5ea0: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
5eb0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
5ec0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
5ed0: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
5ee0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
5ef0: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
5f00: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
5f10: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
5f20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
5f30: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
5f40: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
5f50: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
5f60: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
5f70: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
5f80: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
5f90: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
5fa0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
5fb0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5fc0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
5fd0: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
5fe0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
5ff0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
6000: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
6010: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
6020: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6030: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
6040: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
6050: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
6060: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
6070: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
6080: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
6090: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
60a0: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
60b0: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
60c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
60d0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
60e0: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
60f0: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
6100: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
6110: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
6120: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
6130: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
6140: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
6150: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
6160: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
6170: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
6180: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
6190: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
61a0: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
61b0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
61c0: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
61d0: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
61e0: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
61f0: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
6200: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
6210: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
6220: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
6230: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
6240: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
6250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6260: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6270: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
6280: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
6290: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
62a0: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
62b0: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
62c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
62d0: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
62e0: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
62f0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6300: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
6310: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
6320: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
6330: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
6340: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
6350: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
6360: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
6390: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
63a0: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
63b0: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
63c0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
63d0: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
63f0: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
6420: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
6430: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
6440: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
6450: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
6460: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
6470: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
6480: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
6490: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
64a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
64b0: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
64c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
64d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
64e0: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
64f0: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
6500: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6510: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
6520: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
6530: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6540: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
6550: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
6560: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6570: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6580: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
6590: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
65a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
65b0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
65c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
65d0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
65e0: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
65f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
6600: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
6610: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
6620: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
6630: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
6640: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
6650: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
6660: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
6670: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
6680: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
6690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
66a0: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
66b0: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
66c0: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
66d0: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
66e0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
66f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
6700: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
6710: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
6720: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
6730: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
6740: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
6750: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
6760: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
6770: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
6780: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
6790: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
67a0: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
67b0: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
67c0: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
67d0: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
67e0: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
67f0: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
6800: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
6810: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
6820: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
6830: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
6840: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
6850: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
6860: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
6870: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
6880: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
6890: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
68a0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
68b0: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
68c0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
68d0: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
68e0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
68f0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
6900: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
6910: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
6920: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
6930: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6940: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
6950: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
6960: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
6970: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
6980: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
69b0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
69c0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
69d0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
69e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
69f0: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
6a00: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
6a10: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6a20: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
6a30: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
6a40: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
6a50: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
6a60: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
6a70: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
6a80: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
6a90: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
6aa0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
6ab0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
6ac0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6ad0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
6ae0: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
6af0: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
6b00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6b10: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6b20: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
6b30: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
6b40: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
6b50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
6b60: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
6b70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6b80: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
6b90: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
6ba0: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
6bb0: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
6bc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
6bd0: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
6be0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6bf0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
6c00: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
6c10: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
6c20: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
6c30: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
6c40: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
6c50: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
6c60: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
6c70: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
6c80: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
6c90: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
6ca0: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
6cb0: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
6cc0: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
6cd0: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
6ce0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
6cf0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
6d00: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
6d10: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
6d20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
6d30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
6d40: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
6d50: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
6d60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
6d70: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
6d80: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
6d90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6da0: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
6db0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
6dc0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
6dd0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
6de0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
6df0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6e00: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6e10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
6e20: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
6e30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6e40: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
6e50: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
6e60: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6e70: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
6e80: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
6e90: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
6ea0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
6eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
6ec0: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
6ed0: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
6ee0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
6ef0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
6f00: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
6f10: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
6f20: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
6f30: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
6f40: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
6f50: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
6f60: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
6f70: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
6f80: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
6f90: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
6fa0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
6fb0: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
6fc0: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
6fd0: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
6fe0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
6ff0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
7000: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
7010: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
7020: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
7030: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
7040: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
7050: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
7060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7070: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
7080: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7090: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
70a0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
70b0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
70c0: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
70d0: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
70e0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
70f0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
7100: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
7110: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7120: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
7130: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
7140: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
7150: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
7160: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
7170: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
71a0: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
71b0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
71e0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
71f0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
7200: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
7210: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
7220: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
7230: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
7240: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
7250: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
7260: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
7270: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7280: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
7290: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
72a0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
72b0: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
72c0: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
72d0: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
72e0: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
72f0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
7300: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
7310: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
7320: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
7330: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
7340: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
7350: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
7360: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
7370: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
7380: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
7390: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
73a0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
73b0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
73c0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
73d0: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
73e0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
73f0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
7400: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
7410: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
7420: 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79  Pager);.  memcpy
7430: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
7440: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7450: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
7460: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
7470: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
7480: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
7490: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
74a0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
74b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
74c0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
74d0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
74e0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
74f0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
7500: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
7510: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
7520: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
7530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
7540: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
7550: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
7560: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
7570: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
7580: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
7590: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
75a0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
75b0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
75c0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
75d0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
75e0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
75f0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
7600: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
7610: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
7620: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
7630: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
7640: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
7650: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7660: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
7670: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
7680: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
7690: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
76a0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
76b0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
76c0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
76d0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
76e0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
76f0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
7700: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
7710: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
7720: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
7730: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
7740: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
7750: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
7760: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
7770: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
7780: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
7790: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
77a0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
77b0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
77c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
77d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
77e0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
77f0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
7800: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
7810: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
7820: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
7830: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7840: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
7850: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
7860: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
7870: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
7880: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
7890: 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d  ync) || (pPager-
78a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
78b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
78c0: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
78d0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
78e0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
78f0: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
7900: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
7910: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75  ND) .  ){.    pu
7920: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
7930: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
7940: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
7950: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
7960: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
7970: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7980: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29  urnalMagic)], 0)
7990: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
79a0: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
79b0: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
79c0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
79d0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
79e0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
79f0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
7a00: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
7a10: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7a20: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7a30: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
7a40: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
7a50: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
7a60: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
7a70: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
7a80: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
7a90: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
7aa0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
7ab0: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
7ac0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
7ad0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
7ae0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
7af0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7b00: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
7b10: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
7b20: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ize);..  /* The 
7b30: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  page size */.  p
7b40: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7b50: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7b60: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
7b70: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
7b80: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
7b90: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
7ba0: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
7bb0: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
7bc0: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
7bd0: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
7be0: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
7bf0: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
7c00: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
7c10: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
7c20: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
7c30: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
7c40: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
7c50: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
7c60: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
7c70: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
7c80: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
7c90: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7ca0: 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20  gic)+20], 0,.   
7cb0: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
7cc0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7cd0: 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a  gic)+20));..  /*
7ce0: 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69   In theory, it i
7cf0: 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79  s only necessary
7d00: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38   to write the 28
7d10: 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20   bytes that the 
7d20: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
7d30: 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f  ader consumes to
7d40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7d50: 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63  e here. Then inc
7d60: 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a  rement the .  **
7d70: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
7d80: 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f  f variable by JO
7d90: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20  URNAL_HDR_SZ so 
7da0: 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20  that the next . 
7db0: 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72   ** record is wr
7dc0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c  itten to the fol
7dd0: 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c  lowing sector (l
7de0: 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20  eaving a gap in 
7df0: 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68  the file.  ** th
7e00: 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69  at will be impli
7e10: 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20  citly filled in 
7e20: 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a  by the OS)..  **
7e30: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74  .  ** However it
7e40: 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76   has been discov
7e50: 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d  ered that on som
7e60: 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70  e systems this p
7e70: 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a  attern can .  **
7e80: 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c   be significantl
7e90: 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f  y slower than co
7ea0: 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69  ntiguously writi
7eb0: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ng data to the f
7ec0: 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69  ile,.  ** even i
7ed0: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70  f that means exp
7ee0: 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20  licitly writing 
7ef0: 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63  data to the bloc
7f00: 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52  k of .  ** (JOUR
7f10: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
7f20: 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c   bytes that will
7f30: 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f   not be used. So
7f40: 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20   that is what.  
7f50: 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a  ** is done. .  *
7f60: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  *.  ** The loop 
7f70: 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65  is required here
7f80: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63   in case the sec
7f90: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
7fa0: 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
7fb0: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
7fc0: 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20  size. Since the 
7fd0: 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69  zHeader buffer i
7fe0: 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67  s only Pager.pag
7ff0: 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73  eSize.  ** bytes
8000: 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74   in size, more t
8010: 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  han one call to 
8020: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
8030: 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64   may be required
8040: 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  .  ** to populat
8050: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
8060: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
8070: 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  or..  */ .  for(
8080: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
8090: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
80a0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
80b0: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
80c0: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
80d0: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
80e0: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
80f0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
8100: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
8110: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
8120: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
8130: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
8140: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
8150: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
8160: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8170: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
8180: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
8190: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
81a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
81b0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
81c0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
81d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
81e0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
81f0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
8200: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
8210: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
8220: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
8230: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
8240: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
8250: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8260: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
8270: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8280: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
8290: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
82a0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
82b0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
82c0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
82d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
82e0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
82f0: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
8300: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
8310: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
8320: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
8330: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
8340: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
8350: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
8360: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
8370: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
8380: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
8390: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
83a0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
83b0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
83c0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
83d0: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
83e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
83f0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
8400: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
8410: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
8420: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
8430: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8440: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
8450: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
8460: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
8470: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
8480: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
8490: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
84a0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
84b0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
84c0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
84d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
84e0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
84f0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
8500: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
8510: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
8520: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
8530: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8540: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  r object */.  i6
8550: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20  4 journalSize,  
8560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
8570: 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  ze of the open j
8580: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
8590: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ytes */.  u32 *p
85a0: 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20  NRec,           
85b0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
85c0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
85d0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f  he nRec field */
85e0: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20  .  u32 *pDbSize 
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8600: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66  /* OUT: Value of
8610: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
8620: 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f  se size field */
8630: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
8660: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
8670: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
8680: 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20      /* A buffer 
8690: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
86a0: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
86b0: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
86c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
86d0: 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  fset of journal 
86e0: 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61  header being rea
86f0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
8700: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
8710: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
8720: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
8730: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
8740: 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72  /* Advance Pager
8750: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74  .journalOff to t
8760: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
8770: 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20  next sector. If 
8780: 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
8790: 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61   file is too sma
87a0: 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  ll for there to 
87b0: 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72  be a header stor
87c0: 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ed at this.  ** 
87d0: 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51  point, return SQ
87e0: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a  LITE_DONE..  */.
87f0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8800: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
8810: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
8820: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
8830: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
8840: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8850: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
8860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8870: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
8880: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
8890: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
88a0: 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
88b0: 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66  first 8 bytes of
88c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
88d0: 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20  der. If they do 
88e0: 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74  not match.  ** t
88f0: 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67  he  magic string
8900: 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74   found at the st
8910: 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72  art of each jour
8920: 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75  nal header, retu
8930: 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  rn.  ** SQLITE_D
8940: 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ONE. If an IO er
8950: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
8960: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
8970: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a  . Otherwise,.  *
8980: 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  * proceed..  */.
8990: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
89a0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
89b0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
89c0: 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66  (aMagic), iHdrOf
89d0: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  f);.  if( rc ){.
89e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
89f0: 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
8a00: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
8a10: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
8a20: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
8a30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8a40: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ONE;.  }..  /* R
8a50: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68  ead the first th
8a60: 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64  ree 32-bit field
8a70: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
8a80: 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65   header: The nRe
8a90: 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68  c.  ** field, th
8aa0: 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69  e checksum-initi
8ab0: 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64  alizer and the d
8ac0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20  atabase size at 
8ad0: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
8ae0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
8af0: 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  n. Return an err
8b00: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
8b10: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
8b20: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
8b30: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8b40: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8b50: 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70  fd, iHdrOff+8, p
8b60: 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c  NRec)).   || SQL
8b70: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8b80: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8b90: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32  >jfd, iHdrOff+12
8ba0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
8bb0: 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Init)).   || SQL
8bc0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8bd0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8be0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36  >jfd, iHdrOff+16
8bf0: 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b  , pDbSize)).  ){
8c00: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8c10: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
8c20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
8c30: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67   ){.    u32 iPag
8c40: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
8c50: 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a       /* Page-siz
8c60: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
8c70: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
8c80: 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65   u32 iSectorSize
8c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8ca0: 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   Sector-size fie
8cb0: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
8cc0: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  ader */.    u16 
8cd0: 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20  iPageSize16;    
8ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
8cf0: 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e   of iPageSize in
8d00: 20 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65   16-bit variable
8d10: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
8d20: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
8d30: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
8d40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
8d50: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
8d60: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8d70: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8d80: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8d90: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
8da0: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
8db0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8dc0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8dd0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
8de0: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
8df0: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
8e00: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
8e10: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
8e20: 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20  the values read 
8e30: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69  from the page-si
8e40: 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
8e50: 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a  ze fields.    **
8e60: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
8e70: 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e  e. To be 'in ran
8e80: 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73  ge', both values
8e90: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f   need to be a po
8ea0: 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77  wer.    ** of tw
8eb0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
8ec0: 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20  r equal to 512, 
8ed0: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
8ee0: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
8ef0: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
8f00: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
8f10: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
8f20: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
8f30: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
8f40: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
8f50: 74 6f 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20  torSize<512.    
8f60: 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51   || iPageSize>SQ
8f70: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8f80: 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a  ZE || iSectorSiz
8f90: 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
8fa0: 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67  E.     || ((iPag
8fb0: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
8fc0: 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53  ze)!=0   || ((iS
8fd0: 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65  ectorSize-1)&iSe
8fe0: 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20  ctorSize)!=0 .  
8ff0: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66    ){.      /* If
9000: 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20   the either the 
9010: 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63  page-size or sec
9020: 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  tor-size in the 
9030: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
9040: 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61  s .      ** inva
9050: 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72  lid, then the pr
9060: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
9070: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
9080: 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20  der must have . 
9090: 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20       ** crashed 
90a0: 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65  before the heade
90b0: 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e  r was synced. In
90c0: 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20   this case stop 
90d0: 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  reading .      *
90e0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
90f0: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  le here..      *
9100: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
9110: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
9120: 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
9130: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74   the page-size t
9140: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
9150: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
9160: 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a  journal. .    **
9170: 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28   Use a testcase(
9180: 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20  ) macro to make 
9190: 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  sure that malloc
91a0: 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20   failure within 
91b0: 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74  .    ** PagerSet
91c0: 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65  Pagesize() is te
91d0: 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sted..    */.   
91e0: 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28   iPageSize16 = (
91f0: 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20  u16)iPageSize;. 
9200: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
9210: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
9220: 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
9230: 7a 65 31 36 29 3b 0a 20 20 20 20 74 65 73 74 63  ze16);.    testc
9240: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
9250: 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OK );.    assert
9260: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9270: 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d  || iPageSize16==
9280: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29  (u16)iPageSize )
9290: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
92a0: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
92b0: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
92c0: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
92d0: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
92e0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
92f0: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
9300: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
9310: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
9320: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
9330: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
9340: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
9350: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
9360: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
9370: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
9380: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
9390: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
93a0: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
93b0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
93c0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
93d0: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
93e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
93f0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
9400: 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
9410: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
9420: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
9430: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9440: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
9450: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
9460: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
9470: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9480: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
9490: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
94a0: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
94b0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
94c0: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
94d0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
94e0: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
94f0: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
9500: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
9510: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
9520: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
9530: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
9540: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
9550: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
9560: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
9570: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
9580: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
9590: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
95a0: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
95b0: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
95c0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
95d0: 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
95e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
95f0: 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
9600: 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
9610: 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
9620: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
9630: 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
9640: 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
9650: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
9660: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
9670: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
9680: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
9690: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
96a0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
96b0: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
96c0: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
96d0: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
96e0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
96f0: 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
9700: 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
9710: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
9720: 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
9730: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
9740: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
9750: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
9760: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
9770: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
9780: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
9790: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
97a0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
97b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
97c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
97d0: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
97e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9810: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
9820: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
9830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
9840: 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
9850: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
9860: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9880: 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
9890: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
98a0: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
98b0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
98c0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
98d0: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
98e0: 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
98f0: 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9910: 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
9920: 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
9930: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
9940: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9950: 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  er.   || pPager-
9960: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9970: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9980: 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
9990: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
99a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
99b0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
99c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
99d0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
99e0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
99f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
9a00: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
9a10: 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
9a20: 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
9a30: 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
9a40: 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
9a50: 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
9a60: 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
9a70: 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
9a80: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
9a90: 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
9aa0: 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
9ab0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
9ac0: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
9ad0: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
9ae0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
9af0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
9b00: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
9b10: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
9b20: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
9b30: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
9b40: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
9b50: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
9b60: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
9b70: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
9b80: 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
9b90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
9ba0: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
9bb0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
9bc0: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
9bd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
9be0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
9bf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
9c00: 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
9c10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9c20: 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
9c30: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
9c40: 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
9c50: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
9c60: 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
9c70: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
9c80: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9c90: 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
9ca0: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
9cb0: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
9cc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9cd0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9ce0: 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
9cf0: 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
9d00: 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
9d10: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
9d20: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9d30: 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
9d40: 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
9d50: 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
9d60: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
9d70: 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
9d80: 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
9d90: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9da0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9db0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
9dc0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
9dd0: 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
9de0: 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
9df0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
9e00: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9e10: 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
9e20: 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  +20);.  pPager->
9e30: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
9e40: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f  er->noSync;..  /
9e50: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
9e60: 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
9e70: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
9e80: 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
9e90: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
9ea0: 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
9eb0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
9ec0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
9ed0: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
9ee0: 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
9ef0: 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
9f00: 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
9f10: 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
9f20: 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
9f30: 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
9f40: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
9f50: 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
9f60: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
9f70: 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
9f80: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
9f90: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
9fa0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
9fb0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
9fc0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
9fd0: 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
9fe0: 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
9ff0: 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
a000: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
a010: 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
a020: 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
a030: 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
a040: 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
a050: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
a060: 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
a070: 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
a080: 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
a090: 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
a0a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
a0b0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
a0c0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
a0d0: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
a0e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a0f0: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
a100: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
a110: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
a120: 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
a130: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
a140: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
a150: 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
a160: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
a170: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
a180: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
a190: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
a1a0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
a1b0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
a1c0: 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
a1f0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
a200: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
a210: 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
a220: 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
a230: 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
a240: 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
a250: 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
a260: 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
a270: 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
a280: 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
a290: 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
a2a0: 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
a2b0: 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
a2c0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
a2d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  }../*.** Unless 
a2e0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
a2f0: 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73  error-state, dis
a300: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
a310: 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20  ry pages. If.** 
a320: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
a330: 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65  error-state, the
a340: 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  n this call is a
a350: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f   no-op..**.** TO
a360: 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e  DO: Why can we n
a370: 6f 74 20 72 65 73 65 74 20 74 68 65 20 70 61 67  ot reset the pag
a380: 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f  er while in erro
a390: 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74  r state?.*/.stat
a3a0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
a3b0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
a3c0: 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  r){.  if( SQLITE
a3d0: 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72  _OK==pPager->err
a3e0: 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Code ){.    sqli
a3f0: 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
a400: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
a410: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
a420: 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
a430: 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a  ->pPCache);.  }.
a440: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
a450: 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  l structures in 
a460: 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
a470: 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64  oint[] array and
a480: 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67   set both.** Pag
a490: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e  er.aSavepoint an
a4a0: 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69  d Pager.nSavepoi
a4b0: 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73  nt to zero. Clos
a4c0: 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  e the sub-journa
a4d0: 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70  l.** if it is op
a4e0: 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  en and the pager
a4f0: 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
a500: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74  sive mode..*/.st
a510: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
a520: 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50  eAllSavepoints(P
a530: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a540: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
a550: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
a560: 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  or for looping t
a570: 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61  hrough Pager.aSa
a580: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72  vepoint */.  for
a590: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
a5a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
a5b0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a5c0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
a5d0: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a5e0: 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
a5f0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  t);.  }.  if( !p
a600: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
a610: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
a620: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
a630: 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
a640: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
a650: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
a660: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
a670: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
a680: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
a690: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a6a0: 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
a6b0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
a6c0: 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
a6d0: 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
a6e0: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
a6f0: 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
a700: 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
a710: 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
a720: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
a730: 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
a740: 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
a750: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
a760: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
a770: 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
a780: 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
a790: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
a7a0: 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7c0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
a7d0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
a7e0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
a7f0: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
a800: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
a810: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a820: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
a830: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
a840: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
a850: 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
a860: 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
a870: 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
a880: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
a890: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
a8a0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
a8b0: 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
a8c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
a8d0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
a8e0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
a8f0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
a900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a910: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a920: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
a930: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
a940: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
a950: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
a960: 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73  .** is in exclus
a970: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ive mode..**.** 
a980: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
a990: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
a9a0: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
a9b0: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
a9c0: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
a9d0: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
a9e0: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
a9f0: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
aa00: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
aa10: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
aa20: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
aa30: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
aa40: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
aa50: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
aa60: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
aa70: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
aa80: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
aa90: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
aaa0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
aab0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
aac0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
aad0: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
aae0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
aaf0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
ab00: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
ab10: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
ab20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
ab30: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20  urn code */..   
ab40: 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65   /* Always close
ab50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ab60: 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
ab70: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
ab80: 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  k..    ** Otherw
ab90: 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e  ise, another con
aba0: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
abb0: 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
abc0: 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65   might.    ** de
abd0: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75  lete the file ou
abe0: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
abf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
ac00: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
ac10: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71 6c  r->jfd);.    sql
ac20: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
ac30: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
ac40: 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
ac50: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
ac60: 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41 6c  0;.    releaseAl
ac70: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
ac80: 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
ac90: 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
aca0: 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20 65  cked, somebody e
acb0: 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65  lse might change
acc0: 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20   it. The.    ** 
acd0: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
ace0: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65 74   Pager.dbSize et
acf0: 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20  c. might become 
ad00: 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20 2a  invalid if.    *
ad10: 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  * this happens. 
ad20: 54 4f 44 4f 3a 20 52 65 61 6c 6c 79 2c 20 74 68  TODO: Really, th
ad30: 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20  is doesn't need 
ad40: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20  to be cleared.  
ad50: 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63    ** until the c
ad60: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68  hange-counter ch
ad70: 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 70 61 67  eck fails in pag
ad80: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a  erSharedLock()..
ad90: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
ada0: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
adb0: 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73   0;..    rc = os
adc0: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
add0: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
ade0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
adf0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
ae00: 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   = rc;.    }.   
ae10: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
ae20: 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
ae30: 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61 67  )..    /* If Pag
ae40: 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65  er.errCode is se
ae50: 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
ae60: 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
ae70: 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20  he cannot be.   
ae80: 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
ae90: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
aea0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
aeb0: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
aec0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 63  f the.    ** cac
aed0: 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72  he can be discar
aee0: 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ded and the erro
aef0: 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c  r code safely cl
af00: 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
af10: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
af20: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69  rCode ){.      i
af30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
af40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
af50: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
af60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
af70: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
af80: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
af90: 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  }..    pPager->c
afa0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
afb0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
afc0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
afd0: 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  LOCK;.  }.}../*.
afe0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
aff0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
b000: 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c  d when an IOERR,
b010: 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c   CORRUPT or FULL
b020: 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61   error.** may ha
b030: 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65  ve occurred. The
b040: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
b050: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
b060: 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74  the pager .** st
b070: 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
b080: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
b090: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
b0a0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
b0b0: 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74  er .** API funct
b0c0: 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
b0d0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
b0e0: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
b0f0: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
b100: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
b110: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
b120: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
b130: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
b140: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
b150: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
b160: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
b170: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
b180: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
b190: 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  n error is clear
b1a0: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
b1b0: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
b1c0: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
b1d0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
b1e0: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
b1f0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
b200: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
b210: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
b220: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
b230: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
b240: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
b250: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
b260: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
b270: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
b280: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
b290: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b2a0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b2b0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
b2c0: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
b2d0: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
b2e0: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
b2f0: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
b300: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
b310: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
b320: 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
b330: 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
b340: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
b350: 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
b360: 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
b370: 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
b380: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
b390: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
b3a0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
b3b0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
b3c0: 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
b3d0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
b3e0: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
b3f0: 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
b400: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
b410: 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
b420: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b430: 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
b440: 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
b450: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
b460: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32  _FULL ||.    rc2
b470: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
b480: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
b490: 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20  E_CORRUPT.  ){. 
b4a0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
b4b0: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28  de = rc;.    if(
b4c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
b4d0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  PAGER_UNLOCK .  
b4e0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
b4f0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
b500: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
b510: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
b520: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
b530: 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65   already unlocke
b540: 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e  d, call pager_un
b550: 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20  lock() now to.  
b560: 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65      ** clear the
b570: 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
b580: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
b590: 20 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20   pager-cache is 
b5a0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65  .      ** comple
b5b0: 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20  tely empty..    
b5c0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72    */.      pager
b5d0: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
b5e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b5f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b600: 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
b610: 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
b620: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
b630: 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
b640: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
b650: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
b660: 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
b670: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
b680: 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
b690: 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
b6a0: 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
b6b0: 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
b6c0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
b6d0: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
b6e0: 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
b6f0: 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
b700: 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
b710: 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
b720: 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
b730: 65 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72  e file and clear
b740: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b750: 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  . If this means 
b760: 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73  that.** there is
b770: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
b780: 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
b790: 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
b7a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74   connection.** t
b7b0: 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
b7c0: 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
b7d0: 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
b7e0: 65 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c  e this one) will
b7f0: 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  .** roll it back
b800: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
b810: 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72  ager has not alr
b820: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b830: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75   error state, bu
b840: 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61  t an IO or.** ma
b850: 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
b860: 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  s during a rollb
b870: 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77  ack, then this w
b880: 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65  ill itself cause
b890: 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74   .** the pager t
b8a0: 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
b8b0: 72 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77  r state. Which w
b8c0: 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62  ill be cleared b
b8d0: 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  y the.** call to
b8e0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c   pager_unlock(),
b8f0: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
b900: 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ove..*/.static v
b910: 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
b920: 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
b930: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
b940: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b950: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
b960: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
b970: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
b980: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
b990: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b9a0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
b9b0: 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
b9c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
b9d0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b9e0: 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
b9f0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
ba00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ba10: 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
ba20: 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
ba30: 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
ba40: 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
ba50: 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
ba60: 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
ba70: 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
ba80: 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
ba90: 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
baa0: 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
bab0: 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
bac0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
bad0: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
bae0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
baf0: 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
bb00: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
bb10: 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
bb20: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
bb30: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  on..** .** If th
bb40: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41  e pager is in PA
bb50: 47 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41  GER_SHARED or PA
bb60: 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
bb70: 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   when this.** ro
bb80: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
bb90: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28   it is a no-op (
bba0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
bbb0: 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  K)..**.** Otherw
bbc0: 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20  ise, any active 
bbd0: 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72  savepoints are r
bbe0: 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eleased..**.** I
bbf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bc00: 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e  le is open, then
bc10: 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65   it is "finalize
bc20: 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e  d". Once a journ
bc30: 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20  al .** file has 
bc40: 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69  been finalized i
bc50: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
bc60: 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72  e to use it to r
bc70: 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74  oll back a .** t
bc80: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20  ransaction. Nor 
bc90: 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69  will it be consi
bca0: 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f  dered to be a ho
bcb0: 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69  t-journal by thi
bcc0: 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65  s.** or any othe
bcd0: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
bce0: 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68  ction. Exactly h
bcf0: 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ow a journal is 
bd00: 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70  finalized.** dep
bd10: 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
bd20: 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72  or not the pager
bd30: 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
bd40: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
bd50: 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  d.** the current
bd60: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50   journal-mode (P
bd70: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
bd80: 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c   value), as foll
bd90: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ows:.**.**   jou
bda0: 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
bdb0: 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
bdc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
bdd0: 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64  is simply closed
bde0: 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20  . This destroys 
bdf0: 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65  an .**     in-me
be00: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  mory journal..**
be10: 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
be20: 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  e==TRUNCATE.**  
be30: 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
be40: 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  is truncated to 
be50: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
be60: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ze..**.**   jour
be70: 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
be80: 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73  .**     The firs
be90: 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68  t 28 bytes of th
bea0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
beb0: 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20  re zeroed. This 
bec0: 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20  invalidates.**  
bed0: 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75     the first jou
bee0: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  rnal header in t
bef0: 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e  he file, and hen
bf00: 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  ce the entire jo
bf10: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
bf20: 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f  e. An invalid jo
bf30: 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f  urnal file canno
bf40: 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
bf50: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
bf60: 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a  lMode==DELETE.**
bf70: 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
bf80: 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20   file is closed 
bf90: 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e  and deleted usin
bfa0: 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
bfb0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49  e()..**.**     I
bfc0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
bfd0: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
bfe0: 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d  ive mode, this m
bff0: 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a  ethod of finaliz
c000: 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a  ing.**     the j
c010: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
c020: 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65  ever used. Inste
c030: 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ad, if the journ
c040: 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20  alMode is.**    
c050: 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
c060: 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
c070: 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
c080: 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
c090: 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f   under.**     jo
c0a0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
c0b0: 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  ST is used inste
c0c0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ad..**.** After 
c0d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  the journal is f
c0e0: 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e  inalized, if run
c0f0: 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c  ning in non-excl
c100: 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a  usive mode, the.
c110: 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  ** pager moves t
c120: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  o PAGER_SHARED s
c130: 74 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72  tate (and downgr
c140: 61 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  ades the lock on
c150: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
c160: 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c   file accordingl
c170: 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  y)..**.** If the
c180: 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
c190: 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
c1a0: 6f 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41  ode and is in PA
c1b0: 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65  GER_SYNCED state
c1c0: 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f  ,.** it moves to
c1d0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
c1e0: 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64  . No locks are d
c1f0: 6f 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72  owngraded when r
c200: 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63  unning in.** exc
c210: 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a  lusive mode..**.
c220: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
c230: 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
c240: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20  rror occurs. If 
c250: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
c260: 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66  during.** any of
c270: 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f   the IO operatio
c280: 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ns to finalize t
c290: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c2a0: 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a  or unlock the.**
c2b0: 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74   database then t
c2c0: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
c2d0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
c2e0: 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65  the user. If the
c2f0: 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74   .** operation t
c300: 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
c310: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
c320: 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65  s, then the code
c330: 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20   still.** tries 
c340: 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
c350: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e  tabase file if n
c360: 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
c370: 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  mode. If the.** 
c380: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c390: 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20   fails as well, 
c3a0: 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65  then the first e
c3b0: 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65  rror code relate
c3c0: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  d.** to the firs
c3d0: 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65  t error encounte
c3e0: 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c  red (the journal
c3f0: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e   finalization on
c400: 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  e) is.** returne
c410: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c420: 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
c430: 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
c440: 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73  ager, int hasMas
c450: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
c460: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
c470: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
c480: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  rom journal fina
c490: 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69  lization operati
c4a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20  on */.  int rc2 
c4b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
c4c0: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
c4d0: 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f  rom db file unlo
c4e0: 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ck operation */.
c4f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
c500: 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
c510: 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
c520: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
c530: 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
c540: 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
c550: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
c560: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
c570: 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
c580: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
c590: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c5a0: 3e 6a 66 64 29 20 29 7b 0a 0a 20 20 20 20 2f 2a  >jfd) ){..    /*
c5b0: 20 54 4f 44 4f 3a 20 54 68 65 72 65 27 73 20 61   TODO: There's a
c5c0: 20 70 72 6f 62 6c 65 6d 20 68 65 72 65 20 69 66   problem here if
c5d0: 20 61 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20   a journal-file 
c5e0: 77 61 73 20 6f 70 65 6e 65 64 20 69 6e 20 4d 45  was opened in ME
c5f0: 4d 4f 52 59 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  MORY.    ** mode
c600: 20 61 6e 64 20 74 68 65 6e 20 74 68 65 20 6a 6f   and then the jo
c610: 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 63 68  urnal-mode is ch
c620: 61 6e 67 65 64 20 74 6f 20 54 52 55 4e 43 41 54  anged to TRUNCAT
c630: 45 20 6f 72 20 50 45 52 53 49 53 54 0a 20 20 20  E or PERSIST.   
c640: 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 74   ** during the t
c650: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
c660: 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20   code should be 
c670: 63 68 61 6e 67 65 64 20 74 6f 20 61 73 73 75 6d  changed to assum
c680: 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  e.    ** that th
c690: 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 68  e journal mode h
c6a0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 73  as not changed s
c6b0: 69 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63  ince the transac
c6c0: 74 69 6f 6e 20 77 61 73 0a 20 20 20 20 2a 2a 20  tion was.    ** 
c6d0: 73 74 61 72 74 65 64 2e 20 41 6e 64 20 74 68 65  started. And the
c6e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
c6f0: 72 6e 61 6c 4d 6f 64 65 28 29 20 66 75 6e 63 74  rnalMode() funct
c700: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  ion should be.  
c710: 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20    ** changed to 
c720: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
c730: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
c740: 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 0a 20 20 20  too..    */..   
c750: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
c760: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
c770: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
c780: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
c790: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c7a0: 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
c7b0: 20 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75   int isMemoryJou
c7c0: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73  rnal = sqlite3Is
c7d0: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
c7e0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73  r->jfd);.      s
c7f0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c800: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
c810: 20 20 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a    if( !isMemoryJ
c820: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
c830: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
c840: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
c850: 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
c860: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
c870: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
c880: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c890: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
c8a0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
c8b0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
c8c0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
c8d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
c8e0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
c8f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
c900: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
c910: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
c920: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c930: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c940: 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70  eMode .     || p
c950: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
c960: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
c970: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
c980: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
c990: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70  zeroJournalHdr(p
c9a0: 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72  Pager, hasMaster
c9b0: 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
c9c0: 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
c9d0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
c9e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
c9f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
ca00: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
ca10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ca20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ca30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
ca40: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
ca50: 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20 29  E_DELETE || rc )
ca60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
ca70: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
ca80: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
ca90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
caa0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
cab0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
cac0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
cad0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
cae0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
caf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
cb00: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
cb10: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
cb20: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
cb30: 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
cb40: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
cb50: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
cb60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73  );.#endif..    s
cb70: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
cb80: 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
cb90: 61 63 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  ache);.    sqlit
cba0: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
cbb0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
cbc0: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
cbd0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
cbe0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
cbf0: 63 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  c = 0;.  }..  if
cc00: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
cc10: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
cc20: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
cc30: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
cc40: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
cc50: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
cc60: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70  ER_SHARED;.    p
cc70: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
cc80: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  ntDone = 0;.  }e
cc90: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
cca0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
ccb0: 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65  CED ){.    pPage
ccc0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
ccd0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
cce0: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
ccf0: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
cd00: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
cd10: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
cd20: 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ified = 0;..  /*
cd30: 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f   TODO: Is this o
cd40: 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74  ptimal? Why is t
cd50: 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c  he db size inval
cd60: 69 64 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a  idated here .  *
cd70: 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  * when the datab
cd80: 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
cd90: 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70  unlocked? */.  p
cda0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
cdb0: 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
cdc0: 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
cdd0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
cde0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
cdf0: 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
ce00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
ce10: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
ce20: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
ce30: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
ce40: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  c);.}../*.** Par
ce50: 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
ce60: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
ce70: 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
ce80: 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
ce90: 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
cea0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
ceb0: 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
cec0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
ced0: 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
cee0: 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
cef0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
cf00: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
cf10: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
cf20: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
cf30: 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
cf40: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
cf50: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
cf60: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
cf70: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
cf80: 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
cf90: 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
cfa0: 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
cfb0: 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
cfc0: 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
cfd0: 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
cfe0: 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
cff0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
d000: 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
d010: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
d020: 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
d030: 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
d040: 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
d050: 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
d060: 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
d070: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
d080: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
d090: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
d0a0: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
d0b0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
d0c0: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
d0d0: 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
d0e0: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
d0f0: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
d100: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
d110: 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
d120: 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
d130: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
d140: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
d150: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
d160: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
d170: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
d180: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
d190: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
d1a0: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
d1b0: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
d1c0: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
d1d0: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
d1e0: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
d1f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
d200: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
d210: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
d220: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
d230: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
d240: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
d250: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
d260: 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
d270: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
d280: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d290: 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
d2a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
d2b0: 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
d2c0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
d2d0: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
d2e0: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
d2f0: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
d300: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
d310: 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
d320: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
d330: 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
d340: 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
d350: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
d360: 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
d370: 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
d380: 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
d390: 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
d3a0: 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
d3b0: 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
d3c0: 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
d3d0: 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
d3e0: 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
d3f0: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
d400: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
d410: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d  l..**.** The isM
d420: 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20  ainJrnl flag is 
d430: 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
d440: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
d450: 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a  k journal and.**
d460: 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73   false for the s
d470: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d480: 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  .  The main roll
d490: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
d4a0: 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d  s.** checksums -
d4b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d4c0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e  ournal does not.
d4d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
d4e0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
d4f0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
d500: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
d510: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
d520: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
d530: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
d540: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
d550: 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
d560: 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
d570: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
d580: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
d590: 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
d5a0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
d5b0: 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
d5c0: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
d5d0: 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
d5e0: 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
d5f0: 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
d600: 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
d610: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
d620: 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
d630: 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
d640: 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
d650: 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
d660: 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
d670: 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
d680: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
d690: 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
d6a0: 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
d6b0: 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
d6c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
d6d0: 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
d6e0: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
d6f0: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d700: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
d710: 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
d720: 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
d730: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
d740: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
d750: 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
d760: 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
d770: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
d780: 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
d790: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
d7a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d7b0: 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
d7c0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
d7d0: 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
d7e0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
d7f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
d800: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
d810: 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
d820: 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
d830: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
d840: 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
d850: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
d860: 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
d870: 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
d880: 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
d890: 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
d8a0: 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
d8b0: 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
d8c0: 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
d8d0: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
d8e0: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
d8f0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
d900: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
d910: 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
d920: 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
d930: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
d940: 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
d950: 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
d960: 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
d970: 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
d980: 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
d990: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
d9a0: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
d9b0: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
d9c0: 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
d9d0: 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
d9e0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
d9f0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
da00: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
da10: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
da20: 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
da30: 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
da40: 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
da50: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
da60: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
da70: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
da80: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
daa0: 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
dab0: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
dac0: 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dae0: 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
daf0: 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
db00: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
db10: 69 73 55 6e 73 79 6e 63 2c 20 20 20 20 20 20 20  isUnsync,       
db20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
db30: 65 20 69 66 20 72 65 61 64 69 6e 67 20 66 72 6f  e if reading fro
db40: 6d 20 75 6e 73 79 6e 63 65 64 20 6d 61 69 6e 20  m unsynced main 
db50: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
db60: 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
db70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
db80: 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
db90: 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
dba0: 69 6e 74 20 69 73 53 61 76 65 70 6e 74 2c 20 20  int isSavepnt,  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbc0: 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
dbd0: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
dbe0: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
dbf0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
dc00: 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
dc10: 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
dc20: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  yed back */.){. 
dc30: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
dc40: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
dc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
dc60: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
dc70: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
dc80: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dca0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
dcb0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
dcc0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
dcd0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
dce0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
dcf0: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
dd00: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
dd10: 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20    u8 *aData;    
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
dd40: 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
dd50: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
dd60: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
dd70: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
dd80: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
dd90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dda0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
ddb0: 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
ddc0: 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
ddd0: 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
dde0: 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
ddf0: 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
de00: 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
de10: 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
de20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
de30: 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
de40: 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
de50: 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
de60: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
de70: 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
de80: 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
de90: 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
dea0: 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
deb0: 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
dec0: 20 61 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50   aData = (u8*)pP
ded0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
dee0: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
def0: 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
df00: 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
df10: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
df20: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
df30: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
df40: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
df50: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
df60: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
df70: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
df80: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
df90: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
dfa0: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
dfb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
dfc0: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
dfd0: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
dfe0: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
dff0: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
e000: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
e010: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
e020: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e030: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e040: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
e050: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
e060: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
e070: 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
e080: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e090: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
e0a0: 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
e0b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
e0c0: 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
e0d0: 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
e0e0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
e0f0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
e100: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
e110: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
e120: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
e130: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
e140: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
e150: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
e160: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
e170: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
e180: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
e190: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
e1a0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
e1b0: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
e1c0: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
e1d0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
e1e0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
e1f0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
e200: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
e210: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
e220: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
e230: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
e240: 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
e250: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e260: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
e270: 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
e280: 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
e290: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
e2a0: 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
e2b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e2c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
e2d0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
e2e0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
e2f0: 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
e300: 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
e310: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
e320: 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
e330: 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
e340: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
e350: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
e360: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e370: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
e380: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e  .  }..  if( pDon
e390: 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
e3a0: 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
e3b0: 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
e3c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
e3d0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
e3e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
e3f0: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
e400: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
e410: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
e420: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
e430: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
e440: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
e450: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
e460: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
e470: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
e480: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
e490: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
e4a0: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
e4b0: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
e4c0: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
e4d0: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
e4e0: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
e4f0: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
e500: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
e510: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
e520: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
e530: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
e540: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
e550: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
e560: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
e570: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
e580: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
e590: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
e5a0: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
e5b0: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
e5c0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
e5d0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e5e0: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
e5f0: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
e600: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
e610: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
e620: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
e630: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
e640: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
e650: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
e660: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
e670: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
e680: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
e690: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
e6a0: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
e6b0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
e6c0: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
e6d0: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
e6e0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
e6f0: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
e700: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
e710: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
e720: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
e730: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
e740: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
e750: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
e760: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
e770: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
e780: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
e790: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
e7a0: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
e7b0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
e7c0: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
e7d0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
e7e0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
e7f0: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
e800: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
e810: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
e820: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
e830: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
e840: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
e850: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
e860: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
e870: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
e880: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
e890: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
e8a0: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
e8b0: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
e8c0: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
e8d0: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
e8e0: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
e8f0: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
e900: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
e910: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
e920: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
e930: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
e940: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
e950: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
e960: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
e970: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
e980: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
e990: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
e9a0: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
e9b0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
e9c0: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
e9d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
e9e0: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
e9f0: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
ea00: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
ea10: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
ea20: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
ea30: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
ea40: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
ea50: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
ea60: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
ea70: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
ea80: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
ea90: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
eaa0: 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
eab0: 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
eac0: 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
ead0: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
eae0: 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
eaf0: 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
eb00: 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
eb10: 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
eb20: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
eb30: 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
eb40: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
eb50: 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
eb60: 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
eb70: 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
eb80: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
eb90: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
eba0: 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
ebb0: 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
ebc0: 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
ebd0: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
ebe0: 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20  e %d hash(%08x) 
ebf0: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
ec00: 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
ec10: 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
ec20: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
ec30: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44  er->pageSize, aD
ec40: 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
ec50: 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
ec60: 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
ec70: 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
ec80: 20 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67   ));.  if( (pPag
ec90: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
eca0: 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26  _EXCLUSIVE).   &
ecb0: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  & (pPg==0 || 0==
ecc0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
ecd0: 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20  R_NEED_SYNC)).  
ece0: 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
ecf0: 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 21 69 73  r->fd).   && !is
ed00: 55 6e 73 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20  Unsync.  ){.    
ed10: 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
ed20: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
ed30: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
ed40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
ed50: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  te(pPager->fd, a
ed60: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
ed70: 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20  geSize, ofst);. 
ed80: 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
ed90: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
eda0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
edb0: 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
edc0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  o;.    }.    sql
edd0: 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
ede0: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
edf0: 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 3b 0a  , pgno, aData);.
ee00: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
ee10: 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
ee20: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
ee30: 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
ee40: 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
ee50: 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
ee60: 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
ee70: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
ee80: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
ee90: 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
eea0: 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
eeb0: 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
eec0: 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
eed0: 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
eee0: 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
eef0: 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
ef00: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
ef10: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
ef20: 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
ef30: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
ef40: 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
ef50: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
ef60: 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
ef70: 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
ef80: 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
ef90: 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
efa0: 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
efb0: 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
efc0: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
efd0: 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
efe0: 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
eff0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
f000: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
f010: 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
f020: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f030: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
f040: 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
f050: 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
f060: 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
f070: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
f080: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
f090: 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
f0a0: 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
f0b0: 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
f0c0: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
f0d0: 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
f0e0: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
f0f0: 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
f100: 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
f110: 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
f120: 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
f130: 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
f140: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
f150: 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
f160: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
f170: 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
f180: 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
f190: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
f1a0: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  vepnt );.    if(
f1b0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
f1c0: 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
f1d0: 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
f1e0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
f1f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
f210: 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
f220: 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
f230: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
f240: 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
f250: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
f260: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
f270: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
f280: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
f290: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
f2a0: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
f2b0: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
f2c0: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
f2d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
f2e0: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
f2f0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
f300: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
f310: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
f320: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
f330: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
f340: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
f350: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
f360: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
f370: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
f380: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
f390: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
f3a0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
f3b0: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
f3c0: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
f3d0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
f3e0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
f3f0: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
f400: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
f410: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
f420: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
f430: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
f440: 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
f450: 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
f460: 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
f470: 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
f480: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
f490: 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
f4a0: 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
f4b0: 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
f4c0: 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
f4d0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
f4e0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
f4f0: 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
f500: 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
f510: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
f520: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
f530: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
f540: 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
f550: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
f560: 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
f570: 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
f580: 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
f590: 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20  out to the..    
f5a0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
f5b0: 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
f5c0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
f5d0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
f5e0: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
f5f0: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
f600: 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
f610: 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
f620: 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
f630: 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
f640: 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
f650: 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
f660: 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
f670: 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
f680: 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
f690: 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
f6a0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
f6b0: 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
f6c0: 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
f6d0: 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
f6e0: 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
f6f0: 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
f700: 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
f710: 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
f720: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f730: 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
f740: 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
f750: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
f760: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
f770: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
f780: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
f790: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
f7a0: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
f7b0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
f7c0: 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
f7d0: 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
f7e0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
f7f0: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
f800: 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
f810: 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
f820: 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
f830: 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
f840: 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
f850: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
f860: 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
f870: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
f880: 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
f890: 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
f8a0: 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
f8b0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
f8c0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
f8d0: 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
f8e0: 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
f8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
f900: 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
f910: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
f920: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
f930: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
f940: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
f950: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
f960: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
f970: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
f980: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
f990: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
f9a0: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
f9b0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
f9c0: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
f9d0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
f9e0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
f9f0: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
fa00: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
fa10: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
fa20: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
fa30: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
fa40: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
fa50: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
fa60: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
fa70: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
fa80: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
fa90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
faa0: 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
fab0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
fac0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
fad0: 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
fae0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
faf0: 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
fb00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   This routine lo
fb10: 6f 6b 73 20 61 68 65 61 64 20 69 6e 74 6f 20 74  oks ahead into t
fb20: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
fb30: 66 69 6c 65 20 61 6e 64 20 64 65 74 65 72 6d 69  file and determi
fb40: 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  nes.** whether o
fb50: 72 20 6e 6f 74 20 74 68 65 20 6e 65 78 74 20 72  r not the next r
fb60: 65 63 6f 72 64 20 28 74 68 65 20 72 65 63 6f 72  ecord (the recor
fb70: 64 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 74  d that begins at
fb80: 20 66 69 6c 65 0a 2a 2a 20 6f 66 66 73 65 74 20   file.** offset 
fb90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fba0: 66 66 29 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f  ff) is a well-fo
fbb0: 72 6d 65 64 20 70 61 67 65 20 72 65 63 6f 72 64  rmed page record
fbc0: 20 63 6f 6e 73 69 73 74 69 6e 67 0a 2a 2a 20 6f   consisting.** o
fbd0: 66 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 6e  f a valid page n
fbe0: 75 6d 62 65 72 2c 20 70 50 61 67 65 2d 3e 70 61  umber, pPage->pa
fbf0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
fc00: 63 6f 6e 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65  content, followe
fc10: 64 0a 2a 2a 20 62 79 20 61 20 76 61 6c 69 64 20  d.** by a valid 
fc20: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  checksum..**.** 
fc30: 54 68 65 20 70 61 67 65 72 20 6e 65 76 65 72 20  The pager never 
fc40: 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 74 68  needs to know th
fc50: 69 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  is in order to d
fc60: 6f 20 69 74 73 20 6a 6f 62 2e 20 20 20 54 68 69  o its job.   Thi
fc70: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
fc80: 6f 6e 6c 79 20 75 73 65 64 20 66 72 6f 6d 20 77  only used from w
fc90: 69 74 68 20 61 73 73 65 72 74 28 29 20 61 6e 64  ith assert() and
fca0: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
fcb0: 6f 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  os..*/.static in
fcc0: 74 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  t pagerNextJourn
fcd0: 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 50 61  alPageIsValid(Pa
fce0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
fcf0: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
fd00: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
fd10: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
fd20: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  age */.  u32 cks
fd30: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  um;           /*
fd40: 20 54 68 65 20 70 61 67 65 20 63 68 65 63 6b 73   The page checks
fd50: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  um */.  int rc; 
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd70: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
fd80: 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 73   read operations
fd90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
fda0: 6c 65 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68  le *fd;    /* Th
fdb0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
fdc0: 72 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  r from which we 
fdd0: 61 72 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20  are reading */. 
fde0: 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
fdf0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
fe00: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
fe10: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
fe20: 61 67 65 20 6e 75 6d 62 65 72 20 68 65 61 64 65  age number heade
fe30: 72 20 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61 67  r */.  fd = pPag
fe40: 65 72 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20  er->jfd;.  rc = 
fe50: 72 65 61 64 33 32 62 69 74 73 28 66 64 2c 20 70  read32bits(fd, p
fe60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
fe70: 66 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  f, &pgno);.  if(
fe80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fe90: 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20  { return 0; }   
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fec0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28  *NO_TEST*/.  if(
fed0: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
fee0: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
fef0: 70 50 61 67 65 72 29 20 29 7b 20 72 65 74 75 72  pPager) ){ retur
ff00: 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 2f  n 0; }         /
ff10: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28  *NO_TEST*/.  if(
ff20: 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
ff30: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72 65  er->dbSize ){ re
ff40: 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20  turn 0; }       
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff60: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a  *NO_TEST*/..  /*
ff70: 20 52 65 61 64 20 74 68 65 20 63 68 65 63 6b 73   Read the checks
ff80: 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  um */.  rc = rea
ff90: 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61 67  d32bits(fd, pPag
ffa0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70  er->journalOff+p
ffb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
ffc0: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  4, &cksum);.  if
ffd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ffe0: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f  /*NO_TEST*/..  /
10020 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 20  * Read the data 
10030 61 6e 64 20 76 65 72 69 66 79 20 74 68 65 20 63  and verify the c
10040 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61  hecksum */.  aDa
10050 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72  ta = (u8*)pPager
10060 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
10070 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
10080 64 28 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  d(fd, aData, pPa
10090 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
100a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
100b0 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  f+4);.  if( rc!=
100c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
100d0 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
10100 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  EST*/.  if( page
10110 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
10120 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
10130 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
10140 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
10150 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63  EST*/..  /* Reac
10160 68 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c  h this point onl
10170 79 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  y if the page is
10180 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75   valid */.  retu
10190 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
101a0 2a 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  * !defined(NDEBU
101b0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
101c0 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
101d0 53 54 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61  ST) */../*.** Pa
101e0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
101f0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
10200 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10210 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
10220 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
10230 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
10240 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10250 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
10260 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
10270 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
10280 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
10290 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
102a0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
102b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
102c0 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
102d0 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
102e0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
102f0 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
10300 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
10310 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
10320 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
10330 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
10340 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
10350 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
10360 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10370 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
10380 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
10390 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
103a0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
103b0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
103c0 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
103d0 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
103e0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
103f0 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
10400 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
10410 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
10420 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
10430 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
10440 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
10450 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
10460 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
10470 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
10480 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
10490 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
104a0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
104b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
104c0 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
104d0 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
104e0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
104f0 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
10500 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
10510 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
10520 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
10530 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
10540 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
10550 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
10560 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10570 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
10580 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
10590 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
105a0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
105b0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
105c0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
105d0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
105e0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
105f0 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
10600 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
10610 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
10620 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
10630 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
10640 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
10650 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
10660 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
10670 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
10680 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
10690 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
106a0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
106b0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
106c0 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
106d0 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
106e0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
106f0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
10700 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
10710 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
10720 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
10730 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
10740 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
10750 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
10760 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
10770 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
10780 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
10790 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
107a0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
107b0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
107c0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
107d0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
107e0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
107f0 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
10800 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
10810 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
10820 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
10830 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
10840 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
10850 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
10860 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
10870 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
10880 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
10890 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
108a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
108b0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
108c0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
108d0 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
108e0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
108f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10900 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
10910 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
10920 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
10930 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
10940 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
10950 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
10960 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
10970 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
10980 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
10990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
109a0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
109b0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
109c0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
109d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
109e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
109f0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
10a00 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
10a10 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
10a20 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10a30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10a40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10a50 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
10a60 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
10a70 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
10a80 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
10a90 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
10aa0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
10ab0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
10ac0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
10ad0 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
10ae0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
10af0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
10b00 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
10b10 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
10b20 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
10b30 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
10b40 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
10b50 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
10b60 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
10b70 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10b80 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
10b90 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
10ba0 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
10bb0 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
10bc0 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
10bd0 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
10be0 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
10bf0 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
10c00 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
10c10 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
10c20 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
10c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
10c40 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
10c50 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
10c60 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
10c70 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
10c80 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
10c90 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
10ca0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
10cb0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
10cc0 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
10cd0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
10ce0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
10cf0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
10d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10d10 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
10d20 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
10d30 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
10d40 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
10d50 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
10d60 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72   if( nMasterJour
10d70 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61  nal>0 ){.    cha
10d80 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  r *zJournal;.   
10d90 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
10da0 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  r = 0;.    int n
10db0 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
10dc0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
10dd0 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
10de0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
10df0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
10e00 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
10e10 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
10e20 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
10e30 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
10e40 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
10e50 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
10e60 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
10e70 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r *)sqlite3Mallo
10e80 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
10e90 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
10ea0 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  tr);.    if( !zM
10eb0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
10ec0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10ed0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
10ee0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
10ef0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61  t;.    }.    zMa
10f00 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
10f10 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
10f20 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72  rJournal];.    r
10f30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
10f40 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
10f50 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29  erJournal, (int)
10f60 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
10f70 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
10f80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
10f90 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
10fa0 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
10fb0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
10fc0 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
10fd0 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
10fe0 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
10ff0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nal ){.      int
11000 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72   exists;.      r
11010 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
11020 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
11030 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
11040 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
11050 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
11060 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11070 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
11080 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
11090 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78 69   }.      if( exi
110a0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  sts ){.        /
110b0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
110c0 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
110d0 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
110e0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
110f0 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
11100 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
11110 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
11120 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
11130 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
11140 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
11150 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
11160 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11170 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
11180 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
11190 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
111a0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
111b0 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
111c0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
111d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
111e0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
111f0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
11200 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
11210 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11230 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
11240 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
11250 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
11260 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
11270 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
11280 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
11290 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
112a0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
112b0 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
112c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
112d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
112e0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
112f0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11300 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
11310 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
11320 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
11330 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
11340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
11350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
11360 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
11370 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
11380 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11390 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
113a0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
113b0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
113c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
113d0 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
113e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
113f0 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
11400 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
11410 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11420 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
11430 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
11440 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
11450 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
11460 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
11470 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
11480 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72    .  if( pMaster
11490 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
114a0 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
114b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
114c0 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
114d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
114e0 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
114f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
11500 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11510 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
11520 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
11530 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
11540 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
11550 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
11560 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
11570 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
11580 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
11590 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
115a0 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
115b0 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
115c0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
115d0 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
115e0 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
115f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11600 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20  not open, or an 
11610 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
11620 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74  s not.** held, t
11630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11640 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
11650 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  se, the size of 
11660 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  the file is.** c
11670 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
11680 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
11690 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
116a0 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c  tes). If the fil
116b0 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20  e.** on disk is 
116c0 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
116d0 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
116e0 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
116f0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
11700 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
11710 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
11720 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
11730 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
11740 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
11750 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
11760 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
11770 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
11780 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
11790 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
117a0 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
117b0 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
117c0 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
117d0 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
117e0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
117f0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
11800 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
11810 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
11820 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
11830 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
11840 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
11850 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
11860 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
11870 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
11880 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
11890 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
118a0 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
118b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
118c0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
118d0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
118e0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
118f0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
11900 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
11910 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
11920 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11930 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
11940 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
11950 45 58 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f  EXCLUSIVE && isO
11960 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
11970 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
11980 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
11990 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
119a0 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
119b0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
119c0 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
119d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
119e0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
119f0 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
11a00 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
11a10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
11a20 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
11a30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11a40 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
11a50 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
11a60 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
11a70 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
11a80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11a90 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11aa0 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
11ab0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11ac0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11ad0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
11ae0 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
11af0 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
11b00 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
11b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11b20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
11b30 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
11b40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11b50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11b60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11b70 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
11b80 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
11b90 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
11ba0 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
11bb0 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
11bc0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
11bd0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
11be0 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
11bf0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
11c00 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
11c10 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
11c20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
11c30 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
11c40 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
11c50 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
11c60 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
11c70 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
11c80 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
11c90 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
11ca0 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
11cb0 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
11cc0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
11cd0 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
11ce0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
11cf0 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
11d00 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
11d10 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
11d20 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
11d30 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
11d40 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
11d50 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
11d60 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 35 31 32  ounded up to 512
11d70 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
11d80 73 20 74 68 61 6e 20 35 31 32 2c 20 6f 72 20 72  s than 512, or r
11d90 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
11da0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
11db0 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
11dc0 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
11dd0 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  OR_SIZE..*/.stat
11de0 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
11df0 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
11e00 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
11e10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
11e20 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
11e30 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
11e40 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
11e50 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
11e60 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
11e70 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
11e80 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
11e90 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
11ea0 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
11eb0 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
11ec0 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
11ed0 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
11ee0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
11ef0 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
11f00 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
11f10 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
11f20 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
11f30 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
11f40 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
11f50 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29  sectorSize<512 )
11f60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
11f70 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
11f80 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
11f90 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58  ->sectorSize>MAX
11fa0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
11fb0 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
11fc0 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
11fd0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
11fe0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58  sectorSize = MAX
11ff0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
12000 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
12010 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
12020 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
12030 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12040 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
12050 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
12060 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
12070 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
12080 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
12090 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
120a0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
120b0 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
120c0 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
120d0 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
120e0 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
120f0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
12100 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12110 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
12120 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
12130 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
12140 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
12150 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
12160 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
12170 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
12180 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
12190 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
121a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
121b0 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
121c0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
121d0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
121e0 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
121f0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
12200 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
12210 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
12220 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
12230 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12240 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
12250 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
12260 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
12270 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
12280 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
12290 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
122a0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
122b0 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
122c0 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
122d0 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
122e0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
122f0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
12300 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
12310 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
12320 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29  ge case..**  (7)
12330 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
12340 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
12350 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
12360 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12370 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
12380 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
12390 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
123a0 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
123b0 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
123c0 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
123d0 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73 20  *  (8)  N bytes 
123e0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
123f0 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
12400 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
12410 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
12420 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
12430 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
12440 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
12450 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
12460 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
12470 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
12480 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
12490 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
124a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
124b0 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
124c0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
124d0 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
124e0 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72  **  (9)  Zero or
124f0 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
12500 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
12510 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
12520 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
12530 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
12540 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
12550 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
12560 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
12570 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
12580 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
12590 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
125a0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
125b0 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
125c0 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  8 items above..*
125d0 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
125e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
125f0 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
12600 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 9th item..**.*
12610 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
12620 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
12630 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
12640 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
12650 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
12660 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
12670 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
12680 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
12690 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
126a0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
126b0 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
126c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
126d0 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
126e0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
126f0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
12700 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
12710 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
12720 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
12730 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
12740 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
12750 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
12760 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
12770 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
12780 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
12790 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
127a0 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
127b0 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
127c0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
127d0 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
127e0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
127f0 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
12800 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
12810 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
12820 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
12830 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
12840 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
12850 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
12860 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
12870 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
12880 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
12890 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
128a0 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
128b0 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
128c0 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
128d0 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
128e0 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
128f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
12900 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
12910 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
12920 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
12930 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
12940 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
12950 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
12960 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
12970 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
12980 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
12990 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
129a0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
129b0 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
129c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
129d0 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
129e0 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
129f0 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
12a00 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
12a10 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
12a20 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
12a30 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
12a40 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
12a50 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
12a60 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
12a70 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
12a80 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
12a90 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
12aa0 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
12ab0 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
12ac0 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
12ad0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
12ae0 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
12af0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
12b00 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
12b10 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
12b20 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
12b30 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
12b40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
12b50 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
12b60 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
12b70 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
12b80 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
12b90 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
12ba0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
12bb0 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
12bc0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
12bd0 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
12be0 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
12bf0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
12c00 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
12c10 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
12c20 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
12c30 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
12c40 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12c50 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
12c60 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
12c70 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
12c80 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
12c90 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
12ca0 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
12cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
12cc0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
12cd0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12ce0 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
12cf0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
12d00 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
12d10 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
12d20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
12d30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12d40 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
12d50 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
12d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12d70 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
12d80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
12d90 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
12da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
12db0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
12dc0 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
12dd0 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
12de0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
12df0 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
12e00 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
12e10 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12e20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
12e30 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
12e40 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
12e50 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
12e60 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
12e70 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
12e80 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
12e90 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
12ea0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
12eb0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
12ec0 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
12ed0 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
12ee0 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
12ef0 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
12f00 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
12f10 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
12f20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
12f30 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
12f40 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
12f50 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
12f60 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
12f70 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
12f80 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
12f90 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
12fa0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
12fb0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
12fc0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
12fd0 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
12fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
12ff0 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
13000 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
13010 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
13020 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13030 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
13040 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
13050 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
13060 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
13070 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
13080 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
13090 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
130a0 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
130b0 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
130c0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
130d0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
130e0 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
130f0 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
13100 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
13110 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
13120 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
13130 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
13140 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
13150 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
13160 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
13170 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
13180 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
13190 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
131a0 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
131b0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
131c0 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
131d0 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
131e0 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
131f0 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
13200 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
13210 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
13220 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
13230 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
13240 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
13250 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
13260 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
13270 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
13280 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
13290 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
132a0 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
132b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
132c0 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
132d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
132e0 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
132f0 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
13300 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
13310 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
13320 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
13330 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
13340 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
13350 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
13360 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13370 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
13380 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
13390 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
133a0 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
133b0 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
133c0 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
133d0 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
133e0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
133f0 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
13400 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
13410 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
13420 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
13430 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74  le( 1 ){.    int
13440 20 69 73 55 6e 73 79 6e 63 20 3d 20 30 3b 0a 0a   isUnsync = 0;..
13450 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
13460 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
13470 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
13480 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
13490 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
134a0 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
134b0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
134c0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
134d0 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
134e0 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
134f0 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
13500 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
13510 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  of failed while 
13520 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
13530 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
13540 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
13550 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
13560 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
13570 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
13580 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
13590 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
135a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
135b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
135c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
135d0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
135e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
135f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13600 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
13610 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
13620 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
13630 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
13640 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
13650 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
13660 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
13670 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
13680 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
13690 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
136a0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
136b0 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
136c0 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
136d0 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
136e0 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
136f0 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
13700 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
13710 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
13720 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
13730 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
13740 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
13750 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13760 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
13770 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
13780 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
13790 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
137a0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
137b0 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
137c0 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
137d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
137e0 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
137f0 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
13800 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
13810 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
13820 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
13830 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
13840 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
13850 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
13860 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
13870 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
13880 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
13890 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
138a0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
138b0 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
138c0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
138d0 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
138e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
138f0 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
13900 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
13910 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
13920 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
13930 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
13940 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
13950 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
13960 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
13970 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
13980 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
13990 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
139a0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
139b0 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
139c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
139d0 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
139e0 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
139f0 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
13a00 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
13a10 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
13a20 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
13a30 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
13a40 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
13a50 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
13a60 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
13a70 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
13a80 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
13a90 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
13aa0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13ab0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
13ac0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
13ad0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
13ae0 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
13af0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
13b00 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
13b10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 52      testcase( nR
13b20 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 0a  ec==0 && !isHot.
13b30 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
13b40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
13b50 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
13b60 61 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a  ager)!=pPager->j
13b70 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20  ournalOff.      
13b80 20 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50     && ((szJ - pP
13b90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13ba0 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
13bb0 5a 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20 20  Z(pPager))>0.   
13bc0 20 20 20 20 20 20 26 26 20 70 61 67 65 72 4e 65        && pagerNe
13bd0 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56  xtJournalPageIsV
13be0 61 6c 69 64 28 70 50 61 67 65 72 29 0a 20 20 20  alid(pPager).   
13bf0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 63   );.    if( nRec
13c00 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
13c10 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
13c20 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
13c30 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
13c40 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
13c50 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
13c60 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
13c70 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
13c80 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
13c90 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
13ca0 3b 0a 20 20 20 20 20 20 69 73 55 6e 73 79 6e 63  ;.      isUnsync
13cb0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
13cc0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
13cd0 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
13ce0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
13cf0 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
13d00 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
13d10 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
13d20 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
13d30 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
13d40 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13d50 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
13d60 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
13d70 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
13d80 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
13d90 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20  r, mxPg);.      
13da0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13db0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
13dc0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
13dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
13de0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
13df0 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xPg;.    }..    
13e00 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
13e10 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
13e20 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
13e30 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  ck into the .   
13e40 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
13e50 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61  e and/or page ca
13e60 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  che..    */.    
13e70 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b  for(u=0; u<nRec;
13e80 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   u++){.      if(
13e90 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
13ea0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
13eb0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
13ec0 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65          needPage
13ed0 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rReset = 0;.    
13ee0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
13ef0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
13f00 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 31 2c  e_page(pPager,1,
13f10 69 73 55 6e 73 79 6e 63 2c 26 70 50 61 67 65 72  isUnsync,&pPager
13f20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 30  ->journalOff,0,0
13f30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13f50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13f60 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
13f70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13f80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
13f90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13fa0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
13fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13fd0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
13fe0 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
13ff0 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 64  back, then the d
14000 61 74 61 62 61 73 65 20 69 73 20 70 72 6f 62 61  atabase is proba
14010 62 6c 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  bly.          **
14020 20 67 6f 69 6e 67 20 74 6f 20 65 6e 64 20 75 70   going to end up
14030 20 62 65 69 6e 67 20 63 6f 72 72 75 70 74 2e 20   being corrupt. 
14040 20 49 74 20 69 73 20 63 6f 72 72 75 70 74 20 74   It is corrupt t
14050 6f 20 75 73 2c 20 61 6e 79 68 6f 77 2e 0a 20 20  o us, anyhow..  
14060 20 20 20 20 20 20 20 20 2a 2a 20 50 65 72 68 61          ** Perha
14070 70 73 20 74 68 65 20 6e 65 78 74 20 70 72 6f 63  ps the next proc
14080 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
14090 67 20 63 61 6e 20 66 69 78 20 69 74 2e 2e 2e 2e  g can fix it....
140a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
140b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
140c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
140d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
140e0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
140f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
14110 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
14120 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
14130 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
14140 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
14150 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
14160 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
14170 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
14180 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
14190 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
141a0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
141b0 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
141c0 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
141d0 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
141e0 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
141f0 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
14200 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
14210 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
14220 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
14230 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
14240 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
14250 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d  .    pPager->fd-
14260 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a  >pMethods==0 ||.
14270 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
14280 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
14290 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
142a0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
142b0 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b  >=SQLITE_OK.  );
142c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
142d0 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
142e0 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
142f0 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
14300 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
14310 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
14320 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
14330 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
14340 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
14350 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
14360 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
14370 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
14380 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
14390 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
143a0 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
143b0 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
143c0 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
143d0 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
143e0 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
143f0 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
14400 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
14410 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
14420 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
14430 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
14440 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
14450 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
14460 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
14470 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
14480 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
14490 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
144a0 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
144b0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
144c0 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
144d0 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
144e0 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
144f0 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
14500 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
14510 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
14520 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
14530 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
14540 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14550 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
14560 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
14570 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
14580 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
14590 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
145a0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
145b0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
145c0 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
145d0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
145e0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
145f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14600 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
14610 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
14620 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
14630 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65  ]!='\0');.    te
14640 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14650 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
14660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14670 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
14680 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
14690 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
146a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
146b0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
146c0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
146d0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
146e0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
146f0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
14700 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
14710 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
14720 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
14730 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
14740 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
14750 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
14760 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
14770 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
14780 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
14790 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
147a0 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
147b0 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
147c0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
147d0 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
147e0 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
147f0 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
14800 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
14810 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
14820 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
14830 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
14840 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
14850 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14860 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
14870 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
14880 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
14890 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
148a0 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
148b0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
148c0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
148d0 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
148e0 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
148f0 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
14900 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
14910 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
14920 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
14930 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
14940 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
14950 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
14960 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
14970 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
14980 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
14990 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
149a0 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
149b0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
149c0 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
149d0 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
149e0 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
149f0 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
14a00 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
14a10 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
14a20 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
14a30 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
14a40 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
14a50 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
14a60 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
14a70 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
14a80 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
14a90 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
14aa0 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
14ab0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
14ac0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
14ad0 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
14ae0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
14af0 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
14b00 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
14b10 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
14b20 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
14b30 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
14b40 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
14b50 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
14b60 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
14b70 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
14b80 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
14b90 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14ba0 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
14bb0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
14bc0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
14bd0 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
14be0 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
14bf0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
14c00 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
14c10 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
14c20 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
14c30 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
14c40 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
14c50 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
14c60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14c70 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
14c80 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
14c90 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
14ca0 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
14cb0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
14cc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
14cd0 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
14ce0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
14cf0 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
14d00 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
14d10 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
14d20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
14d30 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
14d40 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
14d50 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
14d60 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
14d70 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
14d80 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
14d90 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
14da0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
14db0 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
14dc0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
14dd0 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
14de0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
14df0 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
14e00 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
14e10 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
14e20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
14e30 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
14e40 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
14e50 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
14e60 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
14e70 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
14e80 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
14e90 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
14ea0 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
14eb0 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
14ec0 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
14ed0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
14ee0 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
14ef0 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
14f00 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
14f10 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
14f20 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
14f30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
14f40 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
14f50 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
14f60 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
14f70 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
14f80 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
14f90 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
14fa0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
14fb0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
14fc0 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14fe0 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
14ff0 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
15000 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
15010 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15020 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
15030 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
15040 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
15050 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
15060 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
15070 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
15080 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
15090 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
150a0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
150b0 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
150c0 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
150d0 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
150e0 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
150f0 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
15100 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
15110 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
15120 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
15130 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
15140 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
15150 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
15160 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15170 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15180 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
15190 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
151a0 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
151b0 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
151c0 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
151d0 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
151e0 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
151f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
15200 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
15210 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
15220 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
15230 7a 65 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50  ze;..  /* Use pP
15240 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15250 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
15260 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
15270 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
15280 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
15290 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
152a0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
152b0 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
152c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
152d0 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
152e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
152f0 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
15300 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
15310 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15320 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
15330 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
15340 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
15350 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67  alOff;..  /* Beg
15360 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
15370 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
15380 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15390 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
153a0 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
153b0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
153c0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
153d0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
153e0 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
153f0 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
15400 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
15410 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
15420 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
15430 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
15440 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
15450 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
15460 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
15470 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
15480 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
15490 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
154a0 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
154b0 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
154c0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
154d0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
154e0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 48 64 72  oint ){.    iHdr
154f0 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
15500 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
15510 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
15520 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
15530 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15540 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
15550 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
15560 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
15570 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
15580 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
15590 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
155a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
155b0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
155c0 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a  1, 0, &pPager->j
155d0 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44  ournalOff, 1, pD
155e0 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  one);.    }.    
155f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15600 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
15610 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
15620 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
15630 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
15640 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
15650 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
15660 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15670 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
15680 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
15690 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
156a0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
156b0 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
156c0 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
156d0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
156e0 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
156f0 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
15700 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
15710 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
15720 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
15730 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
15740 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
15750 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15770 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
15780 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
15790 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
157a0 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
157b0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
157c0 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
157d0 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
157e0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
157f0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
15800 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
15810 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
15820 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15830 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
15840 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
15850 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
15860 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
15870 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
15880 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
15890 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
158a0 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
158b0 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
158c0 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
158d0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
158e0 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
158f0 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
15900 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
15910 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
15920 74 28 20 21 28 6e 4a 52 65 63 3d 3d 30 0a 20 20  t( !(nJRec==0.  
15930 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
15940 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15950 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15960 65 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)!=pPager->jou
15970 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20 20  rnalOff.        
15980 20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61 67   && ((szJ - pPag
15990 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
159a0 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
159b0 70 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20 20  pPager))>0.     
159c0 20 20 20 20 26 26 20 70 61 67 65 72 4e 65 78 74      && pagerNext
159d0 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61 6c  JournalPageIsVal
159e0 69 64 28 70 50 61 67 65 72 29 29 0a 20 20 20 20  id(pPager)).    
159f0 29 3b 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  );.    if( nJRec
15a00 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
15a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
15a20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
15a30 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
15a40 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
15a50 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
15a60 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61  (u32)((szJ - pPa
15a70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
15a80 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
15a90 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
15aa0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
15ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
15ac0 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
15ad0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
15ae0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
15af0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
15b00 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
15b10 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65  er, 1, 0, &pPage
15b20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
15b30 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a  , pDone);.    }.
15b40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
15b50 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
15b60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
15b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
15b80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15b90 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  ==szJ );..  /* F
15ba0 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
15bb0 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
15bc0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
15bd0 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
15be0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
15bf0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
15c00 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15c10 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
15c20 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
15c30 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
15c40 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
15c50 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
15c60 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
15c70 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
15c80 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
15c90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15ca0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
15cb0 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65  4 offset = pSave
15cc0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
15cd0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
15ce0 7a 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  ze);.    for(ii=
15cf0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
15d00 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
15d10 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
15d20 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
15d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
15d40 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61  ffset==ii*(4+pPa
15d50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
15d60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
15d70 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15d80 70 61 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20  page(pPager, 0, 
15d90 30 2c 20 26 6f 66 66 73 65 74 2c 20 31 2c 20 70  0, &offset, 1, p
15da0 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Done);.    }.   
15db0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
15dc0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
15dd0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
15de0 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
15df0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
15e10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
15e20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  szJ;.  }.  retur
15e30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
15e40 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
15e50 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
15e60 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
15e70 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
15e80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15e90 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
15ea0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
15eb0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
15ec0 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
15ed0 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
15ee0 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
15ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
15f00 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
15f10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15f20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
15f30 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
15f40 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
15f50 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
15f60 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
15f70 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
15f80 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
15f90 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
15fa0 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
15fb0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
15fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
15fd0 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
15fe0 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
15ff0 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
16000 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
16010 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
16020 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
16030 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
16040 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
16050 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
16060 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
16070 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
16080 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
16090 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
160a0 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
160b0 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
160d0 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
160e0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
160f0 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
16100 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16110 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
16120 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
16130 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
16140 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
16150 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
16160 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
16170 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
16180 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
161a0 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
161b0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
161c0 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
161d0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
161e0 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
161f0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
16200 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16210 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
16220 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
16230 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
16240 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
16250 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
16260 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
16270 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
16280 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
16290 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
162a0 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
162b0 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
162c0 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
162d0 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
162e0 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
162f0 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
16300 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
16310 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16320 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
16330 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
16340 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
16350 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
16360 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
16370 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
16380 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16390 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
163a0 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
163b0 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
163c0 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
163d0 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
163e0 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
163f0 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
16400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
16410 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
16420 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
16430 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
16440 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
16450 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c  level, int bFull
16460 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  Fsync){.  pPager
16470 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
16480 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
16490 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
164a0 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
164b0 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
164c0 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
164d0 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
164e0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
164f0 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53   = (bFullFsync?S
16500 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a  QLITE_SYNC_FULL:
16510 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
16520 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  AL);.  if( pPage
16530 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
16540 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
16550 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16560 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
16570 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
16580 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
16590 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
165a0 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
165b0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
165c0 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
165d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
165e0 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
165f0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
16600 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
16610 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
16620 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
16630 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
16640 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
16650 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
16660 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
16670 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16680 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
16690 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
166a0 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
166b0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
166c0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
166d0 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
166e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
166f0 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
16700 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
16710 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
16720 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
16730 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
16740 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
16750 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
16760 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
16770 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
16780 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
16790 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
167a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
167b0 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
167c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
167d0 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
167e0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
167f0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
16800 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
16810 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
16820 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
16830 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
16840 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
16850 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
16860 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
16870 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
16880 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
16890 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
168a0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
168b0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
168c0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
168d0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
168e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
168f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
16900 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
16910 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
16920 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
16930 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
16940 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
16950 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
16960 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
16970 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
16980 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
16990 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
169a0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
169b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
169c0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
169d0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
169e0 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
169f0 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
16a00 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
16a10 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
16a20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
16a30 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
16a40 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
16a50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16a60 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
16a70 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
16a80 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
16a90 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
16aa0 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
16ab0 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
16ac0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
16ad0 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
16ae0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
16af0 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
16b00 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
16b10 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
16b20 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
16b30 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
16b40 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
16b50 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
16b60 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
16b70 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
16b80 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
16b90 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
16ba0 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
16bb0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
16bc0 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
16bd0 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
16be0 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
16bf0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
16c00 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
16c10 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c30 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
16c40 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
16c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c80 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
16c90 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
16ca0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
16cb0 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
16cc0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
16cd0 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
16ce0 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
16cf0 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
16d00 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
16d10 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
16d20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
16d30 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
16d40 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
16d50 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
16d60 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
16d70 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
16d80 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
16d90 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
16da0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
16db0 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
16dc0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
16dd0 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
16de0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
16df0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
16e00 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
16e10 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
16e20 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
16e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
16e40 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
16e50 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
16e60 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
16e70 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16e80 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
16e90 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
16ea0 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
16eb0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
16ec0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
16ed0 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
16ee0 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20  andler */.){  . 
16ef0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
16f00 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
16f10 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
16f20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
16f30 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
16f40 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  g;.}../*.** Set 
16f50 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
16f60 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
16f70 2e 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  . If not NULL, t
16f80 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
16f90 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
16fa0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
16fb0 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
16fc0 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28 72  e is modified (r
16fd0 65 73 74 6f 72 65 64 29 0a 2a 2a 20 61 73 20 70  estored).** as p
16fe0 61 72 74 20 6f 66 20 61 20 74 72 61 6e 73 61 63  art of a transac
16ff0 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e  tion or savepoin
17000 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 54 68 65 20  t rollback. The 
17010 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 0a  callback gives .
17020 2a 2a 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  ** higher-level 
17030 63 6f 64 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e  code an opportun
17040 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
17050 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
17060 20 74 6f 20 0a 2a 2a 20 61 67 72 65 65 20 77 69   to .** agree wi
17070 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
17080 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  page data..*/.vo
17090 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
170a0 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72  etReiniter(Pager
170b0 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
170c0 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
170d0 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  *)){.  pPager->x
170e0 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
170f0 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  it;.}../*.** Cha
17100 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
17110 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
17120 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
17130 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
17140 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
17150 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
17160 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
17170 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
17180 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
17190 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
171a0 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
171b0 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
171c0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
171d0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
171e0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
171f0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
17200 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
17210 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
17220 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
17230 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
17240 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
17250 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
17260 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
17270 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
17280 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
17290 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
172a0 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
172b0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
172c0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
172d0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
172e0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
172f0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
17300 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
17310 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
17320 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
17330 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
17340 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
17350 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
17360 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
17370 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
17380 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
17390 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
173a0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
173b0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
173c0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
173d0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
173e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
173f0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
17400 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
17410 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
17420 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
17430 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
17440 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
17450 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
17460 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
17470 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
17480 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
17490 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
174a0 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
174b0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
174c0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
174d0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
174e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
174f0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
17500 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
17510 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
17520 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
17530 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
17540 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
17550 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
17560 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
17570 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
17580 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
17590 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
175a0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
175b0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
175c0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
175d0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
175e0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
175f0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
17600 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
17610 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
17620 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
17630 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
17640 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
17650 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
17660 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
17670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17680 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61  OK ){.    u16 pa
17690 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
176a0 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
176b0 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
176c0 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
176d0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
176e0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
176f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67  ) );.    if( pag
17700 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
17710 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e!=pPager->pageS
17720 69 7a 65 20 0a 20 20 20 20 20 26 26 20 28 70 50  ize .     && (pP
17730 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
17740 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
17750 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c  ==0).     && sql
17760 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
17770 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
17780 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20  he)==0 .    ){. 
17790 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20       char *pNew 
177a0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
177b0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
177c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
177d0 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !pNew ){.      
177e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
177f0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
17800 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
17810 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
17820 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
17830 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
17840 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ze;.        sqli
17850 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
17860 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
17870 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17880 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
17890 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
178a0 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
178b0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
178c0 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
178d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
178e0 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75   *pPageSize = (u
178f0 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  16)pPager->pageS
17900 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ize;.  }.  retur
17910 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17920 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
17930 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
17940 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
17950 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
17960 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
17970 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
17980 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
17990 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
179a0 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
179b0 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
179c0 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
179d0 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
179e0 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
179f0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
17a00 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
17a10 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
17a20 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
17a30 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
17a40 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
17a50 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
17a60 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
17a70 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
17a80 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
17a90 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
17aa0 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
17ab0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
17ac0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
17ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
17ae0 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
17af0 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
17b00 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
17b10 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
17b20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
17b30 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
17b40 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
17b50 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
17b60 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
17b70 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
17b80 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
17b90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
17ba0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
17bb0 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
17bc0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
17bd0 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
17be0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
17bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
17c00 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
17c10 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
17c20 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
17c30 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
17c40 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
17c50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  age;.  }.  sqlit
17c60 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
17c70 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72  (pPager, 0);.  r
17c80 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
17c90 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
17ca0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
17cb0 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
17cc0 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
17cd0 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
17ce0 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
17cf0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
17d00 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
17d10 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
17d20 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
17d30 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
17d40 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
17d50 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
17d60 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
17d70 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
17d80 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
17d90 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
17da0 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
17db0 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
17dc0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
17dd0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
17de0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
17df0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
17e00 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
17e10 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
17e20 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
17e30 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
17e40 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
17e50 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
17e60 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
17e70 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
17e80 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
17e90 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
17ea0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
17eb0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
17ec0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
17ed0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
17ee0 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
17ef0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
17f00 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
17f10 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
17f20 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
17f30 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
17f40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
17f50 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
17f60 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
17f70 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
17f80 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
17f90 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
17fa0 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
17fb0 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
17fc0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
17fd0 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
17fe0 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
17ff0 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
18000 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
18010 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
18020 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
18030 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
18040 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
18050 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
18060 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
18070 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
18080 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
18090 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
180a0 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
180b0 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
180c0 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
180d0 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
180e0 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
180f0 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
18100 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
18110 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
18120 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
18130 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
18140 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
18150 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
18160 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
18170 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
18180 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18190 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
181a0 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
181b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
181c0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
181d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
181e0 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
181f0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
18200 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18210 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
18220 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
18230 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
18240 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
18250 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
18260 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
18270 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
18280 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
18290 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
182a0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
182b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
182c0 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
182d0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
182e0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
182f0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
18300 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18310 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
18320 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18330 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18340 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
18350 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
18360 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
18370 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70  iated .** with p
18380 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  Pager. Normally,
18390 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61   this is calcula
183a0 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65  ted as (<db file
183b0 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a   size>/<page-siz
183c0 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  e>)..** However,
183d0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
183e0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
183f0 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
18400 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
18410 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
18420 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
18430 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
18440 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72   pager is in err
18450 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
18460 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
18470 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  alled, then the.
18480 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  ** error state e
18490 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
184a0 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
184b0 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  e left unchanged
184c0 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  . Or,.** if the 
184d0 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20  file system has 
184e0 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66 6f  to be queried fo
184f0 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
18500 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
18510 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74 20  e query attempt 
18520 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72  returns an IO er
18530 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ror, the IO erro
18540 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18550 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67  ed.** and *pnPag
18560 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
18570 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ged..**.** Other
18580 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
18590 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
185a0 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  l, then SQLITE_O
185b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
185c0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
185d0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
185e0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
185f0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  e database..*/.i
18600 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
18610 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
18620 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
18630 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
18640 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
18650 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
18660 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
18670 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
18680 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64   pager is alread
18690 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
186a0 74 61 74 65 2c 20 72 65 74 75 72 6e 20 74 68 65  tate, return the
186b0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a   error code. */.
186c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
186d0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
186e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
186f0 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ode;.  }..  /* D
18700 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d  etermine the num
18710 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18720 74 68 65 20 66 69 6c 65 2e 20 53 74 6f 72 65 20  the file. Store 
18730 74 68 69 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a  this in nPage. *
18740 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
18750 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20  dbSizeValid ){. 
18760 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65     nPage = pPage
18770 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c  r->dbSize;.  }el
18780 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20  se{.    int rc; 
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 2f 2a 20 45 72 72 6f 72 20 72 65 74 75 72 6e 65  /* Error returne
187b0 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28  d by OsFileSize(
187c0 29 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d  ) */.    i64 n =
187d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
187e0 20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20 69 6e   /* File size in
187f0 20 62 79 74 65 73 20 72 65 74 75 72 6e 65 64 20   bytes returned 
18800 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  by OsFileSize() 
18810 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
18820 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18830 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
18840 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
18850 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
18860 3e 66 64 29 20 26 26 20 28 30 20 21 3d 20 28 72  >fd) && (0 != (r
18870 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
18880 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
18890 2c 20 26 6e 29 29 29 20 29 7b 0a 20 20 20 20 20  , &n))) ){.     
188a0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
188b0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
188c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
188d0 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
188e0 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
188f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  ze ){.      nPag
18900 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
18910 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
18920 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65  (Pgno)(n / pPage
18930 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
18940 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
18950 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
18960 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
18970 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
18980 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70  = nPage;.      p
18990 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
189a0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
189b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
189c0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  alid = 1;.    }.
189d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
189e0 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
189f0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18a00 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
18a10 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63  than the .  ** c
18a20 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75  onfigured maximu
18a30 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20  m pager number, 
18a40 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  increase the all
18a50 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20  owed limit so.  
18a60 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ** that the file
18a70 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20   can be read..  
18a80 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70  */.  if( nPage>p
18a90 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
18aa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
18ab0 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67  gno = (Pgno)nPag
18ac0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  e;.  }..  /* Set
18ad0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
18ae0 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  able and return 
18af0 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69  SQLITE_OK */.  i
18b00 66 28 20 70 6e 50 61 67 65 20 29 7b 0a 20 20 20  f( pnPage ){.   
18b10 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
18b20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18b30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
18b40 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
18b50 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
18b60 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
18b70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
18b80 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
18b90 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
18ba0 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
18bb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
18bc0 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
18bd0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
18be0 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
18bf0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
18c00 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
18c10 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
18c20 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
18c30 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
18c40 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
18c50 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
18c60 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
18c70 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
18c80 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
18c90 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
18ca0 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
18cb0 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
18cc0 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
18cd0 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
18ce0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
18cf0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18d00 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
18d10 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
18d20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
18d30 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
18d40 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
18d50 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
18d60 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
18d70 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
18d80 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
18d90 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
18da0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
18db0 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
18dc0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
18dd0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
18de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18e00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18e10 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
18e20 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
18e30 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
18e40 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
18e50 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
18e60 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
18e70 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
18e80 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
18e90 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
18ea0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
18eb0 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
18ec0 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
18ed0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
18ee0 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  he file is curre
18ef0 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68  ntly unlocked th
18f00 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74  en the size must
18f10 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20   be unknown */. 
18f20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18f30 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
18f40 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
18f50 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
18f60 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
18f70 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65  at this is eithe
18f80 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75  r a no-op (becau
18f90 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  se the requested
18fa0 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61   lock is .  ** a
18fb0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20  lready held, or 
18fc0 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73  one of the trans
18fd0 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65  istions that the
18fe0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20   busy-handler.  
18ff0 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65  ** may be invoke
19000 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64  d during, accord
19010 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65  ing to the comme
19020 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71  nt above.  ** sq
19030 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
19040 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f  yhandler()..  */
19050 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
19060 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
19070 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ype).       || (
19080 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19090 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c  AGER_UNLOCK && l
190a0 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53  ocktype==PAGER_S
190b0 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
190c0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
190d0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
190e0 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47  && locktype==PAG
190f0 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  ER_EXCLUSIVE).  
19100 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19110 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
19120 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  e ){.    rc = SQ
19130 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
19140 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
19150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
19160 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
19170 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d  locktype);.    }
19180 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
19190 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
191a0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
191b0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
191c0 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69  lerArg) );.    i
191d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
191e0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
191f0 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f  ->state = (u8)lo
19200 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
19210 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
19220 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
19230 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
19240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
19260 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
19270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
19280 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
19290 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
192a0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
192b0 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
192c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
192d0 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
192e0 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
192f0 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
19300 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
19310 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
19320 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
19330 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
19340 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
19350 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
19360 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
19370 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
19380 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
19390 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
193a0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
193b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
193c0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
193d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
193e0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
193f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
19400 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
19410 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
19420 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a  ize = nPage;.}..
19430 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
19440 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
19450 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
19460 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
19470 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
19480 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
19490 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
194a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
194b0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
194c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
194d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
194e0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
194f0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
19500 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
19510 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
19520 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
19530 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
19540 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
19550 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
19560 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
19570 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
19580 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
19590 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
195a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
195b0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
195c0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
195d0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
195e0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
195f0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
19600 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
19610 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
19620 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
19630 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
19640 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
19650 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
19660 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
19670 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
19680 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
19690 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
196a0 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
196b0 29 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  ){.  disable_sim
196c0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
196d0 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
196e0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
196f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
19700 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
19710 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
19720 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
19730 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
19740 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
19750 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
19760 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
19770 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e     /* Set Pager.
19780 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31  journalHdr to -1
19790 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74   for the benefit
197a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c   of the pager_pl
197b0 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a  ayback() .    **
197c0 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20   call which may 
197d0 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74  be made from wit
197e0 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  hin pagerUnlockA
197f0 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66  ndRollback(). If
19800 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
19810 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75  t -1, then the u
19820 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
19830 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  of an open journ
19840 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20  al file may.    
19850 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ** be played bac
19860 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
19870 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
19880 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
19890 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
198a0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
198b0 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
198c0 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
198d0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
198e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
198f0 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c  -1;.    pagerUnl
19900 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
19910 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
19920 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
19930 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
19940 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
19950 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
19960 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
19970 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19980 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
19990 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
199a0 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
199b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
199c0 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
199d0 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
199e0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
199f0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
19a00 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
19a10 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  e);..  assert( !
19a20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
19a30 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
19a40 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
19a50 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19a60 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
19a70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
19a80 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
19a90 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
19aa0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19ab0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
19ac0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
19ad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
19ae0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
19af0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
19b00 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
19b10 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
19b20 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
19b30 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
19b40 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
19b50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19b60 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
19b70 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
19b80 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
19b90 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
19ba0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
19bb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
19bc0 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
19bd0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
19be0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
19bf0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
19c00 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
19c10 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
19c20 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
19c30 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
19c40 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
19c50 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
19c60 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
19c70 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
19c80 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
19c90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
19ca0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
19cb0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
19cc0 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
19cd0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
19ce0 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
19cf0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
19d00 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
19d10 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
19d20 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
19d30 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
19d40 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
19d50 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
19d60 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
19d70 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
19d80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19d90 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
19da0 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
19db0 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
19dc0 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
19dd0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
19de0 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
19df0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
19e00 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
19e10 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
19e20 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
19e30 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
19e40 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
19e50 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
19e60 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
19e70 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
19e80 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
19e90 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
19ea0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
19eb0 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
19ec0 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
19ed0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
19ee0 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
19ef0 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
19f00 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
19f10 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
19f20 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
19f30 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
19f40 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
19f50 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
19f60 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
19f70 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
19f80 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
19f90 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
19fa0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
19fb0 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
19fc0 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
19fd0 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
19fe0 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
19ff0 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1a000 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1a010 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1a020 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1a030 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1a040 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1a050 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1a060 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1a070 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1a080 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1a090 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1a0a0 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1a0b0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1a0c0 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1a0d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a0e0 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1a0f0 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1a100 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1a110 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1a120 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1a130 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1a140 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1a150 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1a160 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1a170 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1a180 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1a190 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1a1a0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1a1b0 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1a1c0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1a1d0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1a1e0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a1f0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1a200 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1a210 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1a220 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a230 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1a240 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1a250 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1a260 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1a270 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1a280 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1a290 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1a2a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1a2b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a2d0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1a2e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1a2f0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1a300 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a310 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1a320 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a330 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a340 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1a350 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1a360 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1a370 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1a380 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 52 65  /* Variable iNRe
1a390 63 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  cOffset is set t
1a3a0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20  o the offset in 
1a3b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a3c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1a3d0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
1a3e0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1a3f0 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
1a400 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1a410 20 20 20 2a 2a 20 54 68 69 73 20 66 69 65 6c 64     ** This field
1a420 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
1a430 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 78   following the x
1a440 53 79 6e 63 28 29 20 6f 70 65 72 61 74 69 6f 6e  Sync() operation
1a450 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  .        ** on t
1a460 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1a470 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
1a480 69 4e 52 65 63 4f 66 66 73 65 74 20 3d 20 70 50  iNRecOffset = pP
1a490 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1a4a0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
1a4b0 61 6c 4d 61 67 69 63 29 3b 0a 0a 20 20 20 20 20  alMagic);..     
1a4c0 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
1a4d0 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
1a4e0 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
1a4f0 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
1a500 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
1a510 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
1a520 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
1a530 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
1a540 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
1a550 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
1a560 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
1a570 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
1a580 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
1a590 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
1a5a0 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
1a5b0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
1a5c0 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
1a5d0 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
1a5e0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
1a5f0 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
1a600 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
1a610 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
1a620 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
1a630 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
1a640 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72  s connections tr
1a650 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
1a660 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
1a670 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
1a680 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
1a690 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
1a6a0 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
1a6b0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
1a6c0 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
1a6d0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
1a6e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a6f0 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
1a700 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
1a710 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1a720 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
1a730 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
1a740 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
1a750 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
1a760 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
1a770 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
1a780 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
1a790 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
1a7a0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
1a7b0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
1a7c0 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
1a7d0 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
1a7e0 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
1a7f0 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
1a800 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1a810 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
1a820 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
1a830 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1a840 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
1a850 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
1a860 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
1a870 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
1a880 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
1a890 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
1a8a0 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
1a8b0 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
1a8c0 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
1a8d0 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
1a8e0 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
1a8f0 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
1a900 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
1a910 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
1a920 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
1a930 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
1a940 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1a950 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
1a960 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
1a970 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
1a980 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
1a990 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
1a9a0 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
1a9b0 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
1a9c0 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
1a9d0 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
1a9e0 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
1a9f0 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
1aa00 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
1aa10 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
1aa20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1aa30 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
1aa40 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
1aa50 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
1aa60 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
1aa70 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 72 63  c[8];.        rc
1aa80 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1aa90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
1aaa0 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
1aab0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1aac0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aad0 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
1aae0 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
1aaf0 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
1ab00 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
1ab10 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
1ab20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ab30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1ab40 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1ab50 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
1ab60 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1ab70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ab80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ab90 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1aba0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1abb0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1abc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1abd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1abe0 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
1abf0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
1ac00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
1ac10 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
1ac20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
1ac30 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
1ac40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
1ac50 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
1ac60 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1ac70 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
1ac80 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
1ac90 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
1aca0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
1acb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
1acc0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
1acd0 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
1ace0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1acf0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
1ad00 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
1ad10 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
1ad20 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
1ad30 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
1ad40 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
1ad50 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
1ad60 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
1ad70 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
1ad80 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
1ad90 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
1ada0 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
1adb0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
1adc0 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
1add0 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
1ade0 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
1adf0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1ae00 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
1ae10 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
1ae20 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1ae30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1ae40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1ae50 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
1ae60 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1ae70 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
1ae80 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1ae90 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1aea0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1aeb0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1aec0 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
1aed0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1aee0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1aef0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1af00 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1af10 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1af20 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
1af30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1af40 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1af50 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1af60 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1af70 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
1af80 6e 22 2c 20 70 50 61 67 65 72 2c 20 69 4e 52 65  n", pPager, iNRe
1af90 63 4f 66 66 73 65 74 2c 20 34 29 29 3b 0a 20 20  cOffset, 4));.  
1afa0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1afb0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1afc0 66 64 2c 20 69 4e 52 65 63 4f 66 66 73 65 74 2c  fd, iNRecOffset,
1afd0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
1afe0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1aff0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b000 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1b010 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1b020 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
1b030 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
1b040 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1b050 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1b060 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1b070 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1b080 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1b090 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1b0a0 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
1b0b0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1b0c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1b0d0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20  er->sync_flags| 
1b0e0 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
1b0f0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d  er->sync_flags==
1b100 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1b110 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
1b120 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
1b130 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1b140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b150 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b160 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1b170 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b180 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63 65  e was just succe
1b190 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
1b1a0 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53 79  Set Pager.needSy
1b1b0 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65  nc .    ** to ze
1b1c0 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  ro and clear the
1b1d0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1b1e0 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67   flag on all pag
1b1f0 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ess..    */.    
1b200 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b210 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b220 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1b230 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1b240 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1b250 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1b260 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1b270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1b290 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1b2a0 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1b2b0 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1b2c0 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1b2d0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1b2e0 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1b2f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1b300 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1b310 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1b320 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1b330 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1b340 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1b350 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1b360 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1b370 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1b380 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1b390 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1b3a0 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1b3b0 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1b3c0 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1b3d0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1b3e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1b3f0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1b400 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1b410 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1b420 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1b430 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1b440 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1b450 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1b460 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1b470 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1b480 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1b490 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1b4a0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1b4b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b4c0 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1b4d0 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1b4e0 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1b4f0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1b500 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1b510 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1b520 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1b530 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1b540 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1b550 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1b560 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1b570 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
1b580 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
1b590 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
1b5a0 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
1b5b0 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1b5c0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1b5d0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
1b5e0 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
1b5f0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
1b600 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
1b610 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
1b620 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
1b630 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
1b640 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1b650 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
1b660 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
1b670 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
1b680 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
1b690 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
1b6a0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
1b6b0 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
1b6c0 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
1b6d0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1b6e0 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
1b6f0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
1b700 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
1b710 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
1b720 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
1b730 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
1b740 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
1b750 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
1b760 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
1b770 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
1b780 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
1b790 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1b7a0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1b7b0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1b7c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1b7d0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1b7e0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
1b7f0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1b800 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
1b810 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
1b820 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
1b830 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
1b840 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1b850 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1b860 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
1b870 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
1b880 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
1b890 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b8b0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1b8c0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b8f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
1b900 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1b910 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b920 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
1b930 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
1b940 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
1b950 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
1b960 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
1b970 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1b980 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1b990 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
1b9a0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
1b9b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
1b9c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
1b9d0 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  ** call is a no-
1b9e0 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  op..  **.  ** Mo
1b9f0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
1ba00 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
1ba10 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
1ba20 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
1ba30 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
1ba40 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
1ba50 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
1ba60 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
1ba70 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
1ba80 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
1ba90 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
1baa0 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
1bab0 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
1bac0 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
1bad0 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
1bae0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
1baf0 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
1bb00 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
1bb10 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
1bb20 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
1bb30 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
1bb40 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
1bb50 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
1bb60 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
1bb70 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
1bb80 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
1bb90 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
1bba0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
1bbb0 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
1bbc0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
1bbd0 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
1bbe0 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
1bbf0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
1bc00 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
1bc10 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
1bc20 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
1bc30 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
1bc40 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
1bc50 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
1bc60 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
1bc70 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
1bc80 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
1bc90 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ck..  */.  asser
1bca0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1bcb0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1bcc0 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
1bcd0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1bce0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
1bcf0 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  LOCK);..  /* If 
1bd00 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
1bd10 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
1bd20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
1bd30 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
1bd40 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
1bd50 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
1bd60 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
1bd70 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
1bd80 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
1bd90 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
1bda0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
1bdb0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
1bdc0 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
1bdd0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
1bde0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
1bdf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
1be00 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
1be10 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
1be20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
1be30 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
1be40 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
1be50 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
1be60 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1be70 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
1be80 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
1be90 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
1bea0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1beb0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
1bec0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1bed0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
1bee0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
1bef0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
1bf00 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
1bf10 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1bf20 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
1bf30 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
1bf40 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
1bf50 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
1bf60 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
1bf70 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
1bf80 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
1bf90 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
1bfa0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1bfb0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
1bfc0 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
1bfd0 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
1bfe0 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
1bff0 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
1c000 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
1c010 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1c020 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
1c030 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
1c040 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
1c050 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
1c060 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1c070 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
1c080 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
1c090 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1c0a0 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
1c0b0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
1c0c0 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
1c0d0 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
1c0e0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
1c0f0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 29 3b  pData, pgno, 6);
1c100 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
1c110 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57  e */..      /* W
1c120 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
1c130 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
1c140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1c150 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1c160 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1c170 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1c180 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
1c190 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
1c1a0 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
1c1b0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1c1c0 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
1c1d0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
1c1e0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
1c1f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1c200 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
1c210 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
1c220 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
1c230 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
1c240 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
1c250 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1c260 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1c270 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1c280 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1c290 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
1c2a0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1c2b0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1c2c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c2d0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
1c2e0 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
1c2f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1c300 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
1c310 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1c320 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
1c330 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
1c340 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
1c350 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
1c360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1c370 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1c380 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
1c390 2c 20 28 75 38 20 2a 29 70 44 61 74 61 29 3b 0a  , (u8 *)pData);.
1c3a0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1c3b0 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
1c3c0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1c3d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c3e0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1c3f0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1c400 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
1c410 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
1c420 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
1c430 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1c440 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
1c450 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1c460 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
1c470 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
1c480 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1c490 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Write);.    }els
1c4a0 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
1c4b0 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
1c4c0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1c4d0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1c4e0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  no));.    }.#ifd
1c4f0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1c500 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
1c510 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
1c520 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
1c530 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
1c540 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
1c550 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
1c560 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c570 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
1c580 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
1c590 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
1c5a0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1c5b0 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
1c5c0 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
1c5d0 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
1c5e0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1c5f0 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
1c600 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
1c610 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
1c620 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
1c630 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1c640 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
1c650 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
1c660 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
1c670 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
1c680 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
1c690 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
1c6a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1c6b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
1c6c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
1c6d0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
1c6e0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
1c6f0 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
1c700 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
1c710 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
1c720 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1c730 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
1c740 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
1c750 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
1c760 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
1c770 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
1c780 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
1c790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
1c7a0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
1c7b0 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
1c7c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c7d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c7e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1c7f0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1c800 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
1c810 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
1c820 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36  g->pData;.    i6
1c830 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
1c840 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
1c850 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c860 0a 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61  .    char *pData
1c870 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1c880 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1c890 67 6e 6f 2c 20 37 29 3b 0a 20 20 0a 20 20 20 20  gno, 7);.  .    
1c8a0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
1c8b0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
1c8c0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1c8d0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1c8e0 67 6e 6f 29 29 3b 0a 20 20 0a 20 20 20 20 61 73  gno));.  .    as
1c8f0 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
1c900 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
1c910 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1c920 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
1c930 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1c940 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
1c950 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
1c960 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1c970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1c990 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
1c9a0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
1c9b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
1c9c0 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20  fset+4);.    }. 
1c9d0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1c9e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
1c9f0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
1ca00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ca10 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
1ca20 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
1ca30 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
1ca40 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
1ca50 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 74 65 73 74  >pgno);.    test
1ca60 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1ca70 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  _OK );.  }.  ret
1ca80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1ca90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1caa0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1cab0 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
1cac0 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
1cad0 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
1cae0 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
1caf0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1cb00 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1cb10 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
1cb20 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
1cb30 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
1cb40 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
1cb50 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
1cb60 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
1cb70 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
1cb80 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
1cb90 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
1cba0 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
1cbb0 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
1cbc0 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
1cbd0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
1cbe0 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
1cbf0 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
1cc00 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
1cc10 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
1cc20 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
1cc30 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
1cc40 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
1cc50 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
1cc60 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
1cc70 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
1cc80 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
1cc90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cca0 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
1ccb0 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
1ccc0 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
1ccd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
1cce0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1ccf0 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
1cd00 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
1cd10 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
1cd20 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
1cd30 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
1cd40 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1cd50 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
1cd60 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
1cd70 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
1cd80 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1cd90 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
1cda0 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
1cdb0 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
1cdc0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
1cdd0 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
1cde0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1cdf0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1ce00 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1ce10 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1ce20 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
1ce30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1ce40 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
1ce50 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
1ce60 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1ce70 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1ce80 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1ce90 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1cea0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
1ceb0 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
1cec0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
1ced0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
1cee0 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e   /* The doNotSyn
1cef0 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79  c flag is set by
1cf00 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1cf10 72 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  rWrite() functio
1cf20 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20  n while it.  ** 
1cf30 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61  is journalling a
1cf40 20 73 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d   set of two or m
1cf50 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1cf60 65 73 20 74 68 61 74 20 61 72 65 20 73 74 6f 72  es that are stor
1cf70 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73  ed.  ** on the s
1cf80 61 6d 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  ame disk sector.
1cf90 20 53 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75   Syncing the jou
1cfa0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rnal is not allo
1cfb0 77 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74  wed while.  ** t
1cfc0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
1cfd0 20 61 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74   as it is import
1cfe0 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d  ant that all mem
1cff0 62 65 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20  bers of such a. 
1d000 20 2a 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73   ** set of pages
1d010 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64   are synced to d
1d020 69 73 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f  isk together. So
1d030 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 74 68  , if the page th
1d040 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
1d050 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20 6d 61   is trying to ma
1d060 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65  ke clean will re
1d070 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
1d080 73 79 6e 63 20 61 6e 64 20 74 68 65 20 64 6f 4e  sync and the doN
1d090 6f 74 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  otSync.  ** flag
1d0a0 20 69 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20   is set, return 
1d0b0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1d0c0 79 74 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63  ything. The pcac
1d0d0 68 65 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20  he layer will.  
1d0e0 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  ** just have to 
1d0f0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c  go ahead and all
1d100 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1d110 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
1d120 6f 66 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67 20  of.  ** reusing 
1d130 70 50 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  pPg..  **.  ** S
1d140 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65  imilarly, if the
1d150 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
1d160 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
1d170 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
1d180 6f 74 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77  ot.  ** try to w
1d190 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
1d1a0 73 20 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b  s of pPg to disk
1d1b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1d1c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
1d1d0 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79  (pPager->doNotSy
1d1e0 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c 61 67 73  nc && pPg->flags
1d1f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1d200 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1d210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1d220 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
1d230 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
1d240 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
1d250 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d260 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
1d270 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
1d280 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1d290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d2a0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
1d2b0 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20 20  llSync && .     
1d2c0 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   !(pPager->journ
1d2d0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1d2e0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1d2f0 29 20 26 26 0a 20 20 20 20 20 20 21 28 73 71 6c  ) &&.      !(sql
1d300 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1d310 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1d320 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
1d330 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1d340 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
1d350 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1d360 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
1d370 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
1d380 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1d390 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
1d3a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
1d3b0 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
1d3c0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
1d3d0 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  size of.  ** the
1d3e0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
1d3f0 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
1d400 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
1d410 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
1d420 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
1d430 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
1d440 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1d450 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
1d460 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61 63 74 75 61  l not.  ** actua
1d470 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74  lly write data t
1d480 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  o the file in th
1d490 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
1d4a0 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
1d4b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
1d4c0 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
1d4d0 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  **.  **   BEGIN;
1d4e0 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e  .  **     <journ
1d4f0 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20  al page X>.  ** 
1d500 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65      <modify page
1d510 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56   X>.  **     SAV
1d520 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 2a 2a 20  EPOINT sp;.  ** 
1d530 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61        <shrink da
1d540 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59  tabase file to Y
1d550 20 70 61 67 65 73 3e 0a 20 20 2a 2a 20 20 20 20   pages>.  **    
1d560 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70     pagerStress(p
1d570 61 67 65 20 58 29 0a 20 20 2a 2a 20 20 20 20 20  age X).  **     
1d580 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
1d590 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 28 58 3e    **.  ** If (X>
1d5a0 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
1d5b0 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
1d5c0 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
1d5d0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
1d5e0 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
1d5f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
1d600 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
1d610 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
1d620 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a 20 66 6f 6c  . Then,.  ** fol
1d630 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c  lowing the "ROLL
1d640 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74  BACK TO sp" stat
1d650 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70  ement, reading p
1d660 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a  age X will read.
1d670 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
1d680 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d690 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
1d6a0 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
1d6b0 58 20 61 73 20 69 74 0a 20 20 2a 2a 20 77 61 73  X as it.  ** was
1d6c0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1d6d0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e  ction started, n
1d6e0 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ot as it was whe
1d6f0 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22  n "SAVEPOINT sp"
1d700 0a 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74  .  ** was execut
1d710 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
1d720 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
1d730 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1d740 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  nt data for page
1d750 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a   X into the .  *
1d760 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
1d770 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
1d780 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
1d790 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
1d7a0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 73  will.  ** be res
1d7b0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
1d7c0 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
1d7d0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1d7e0 20 73 70 22 20 69 73 20 0a 20 20 2a 2a 20 65 78   sp" is .  ** ex
1d7f0 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  ecuted..  */.  i
1d800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d810 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
1d820 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
1d830 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1d840 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 63 20  (pPg) ){.    rc 
1d850 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
1d860 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
1d870 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
1d880 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
1d890 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1d8a0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 69  ase file. */.  i
1d8b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d8c0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   ){.    pPg->pDi
1d8d0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
1d8e0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
1d8f0 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  gelist(pPg);.  }
1d900 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1d910 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
1d920 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1d930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
1d940 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
1d950 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1d960 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1d970 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1d980 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
1d990 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1d9a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
1d9b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1d9c0 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   rc);.}.../*.** 
1d9d0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
1d9e0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
1d9f0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
1da00 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
1da10 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
1da20 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
1da30 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
1da40 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
1da50 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
1da60 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
1da70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
1da80 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
1da90 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
1daa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1dab0 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
1dac0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
1dad0 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
1dae0 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
1daf0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
1db00 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
1db10 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
1db20 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
1db30 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
1db40 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
1db50 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
1db60 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
1db70 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
1db80 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
1db90 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
1dba0 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
1dbb0 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
1dbc0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
1dbd0 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
1dbe0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
1dbf0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1dc00 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1dc10 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
1dc20 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
1dc30 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1dc40 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
1dc50 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
1dc60 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
1dc70 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
1dc80 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
1dc90 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
1dca0 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
1dcb0 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
1dcc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
1dcd0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
1dce0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
1dcf0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
1dd00 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
1dd10 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
1dd20 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
1dd30 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
1dd40 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
1dd50 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
1dd60 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
1dd70 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  d PAGER_NO_READL
1dd80 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  OCK flags..**.**
1dd90 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
1dda0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
1ddb0 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
1ddc0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
1ddd0 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
1dde0 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
1ddf0 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
1de00 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
1de10 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
1de20 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
1de30 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
1de40 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1de50 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
1de60 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
1de70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1de80 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
1de90 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
1dea0 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
1deb0 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
1dec0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
1ded0 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
1dee0 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
1def0 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
1df00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1df10 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1df20 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
1df30 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
1df40 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
1df50 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
1df60 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
1df70 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
1df80 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
1df90 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1dfa0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
1dfb0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1dfc0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1dfd0 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
1dfe0 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
1dff0 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
1e000 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
1e010 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1e020 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
1e030 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1e040 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
1e050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e060 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
1e070 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
1e080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
1e090 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
1e0a0 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
1e0b0 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
1e0c0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1e0d0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
1e0e0 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
1e0f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
1e100 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
1e110 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
1e120 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
1e130 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
1e140 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
1e150 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
1e160 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1e170 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
1e180 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
1e190 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
1e1a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1e1b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e1c0 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
1e1d0 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
1e1e0 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
1e1f0 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
1e200 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
1e210 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
1e220 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1e230 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1e240 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
1e250 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
1e260 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
1e270 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e280 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
1e290 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
1e2a0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
1e2b0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e2c0 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
1e2d0 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
1e2e0 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
1e2f0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
1e300 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
1e310 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1e320 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
1e330 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e340 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
1e350 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
1e360 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
1e370 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
1e380 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
1e390 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
1e3a0 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  rnal */.  int no
1e3b0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
1e3c0 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
1e3d0 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54  DLOCK)!=0;  /* T
1e3e0 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64  rue to omit read
1e3f0 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  -lock */.  int p
1e400 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
1e410 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
1e420 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1e430 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
1e440 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20  PCache */.  u16 
1e450 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
1e460 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
1e470 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
1e480 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
1e490 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1e4a0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1e4b0 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
1e4c0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
1e4d0 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
1e4e0 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
1e4f0 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
1e500 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
1e510 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
1e520 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
1e530 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
1e540 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
1e550 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
1e560 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
1e570 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
1e580 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1e590 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
1e5a0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
1e5b0 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
1e5c0 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
1e5d0 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
1e5e0 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
1e5f0 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
1e600 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
1e610 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
1e620 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
1e630 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
1e640 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
1e650 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
1e660 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
1e670 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
1e680 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
1e690 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
1e6a0 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
1e6b0 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
1e6c0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
1e6d0 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
1e6e0 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
1e6f0 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
1e700 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
1e710 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
1e720 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
1e730 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
1e740 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
1e750 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
1e760 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
1e770 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
1e780 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
1e790 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
1e7a0 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
1e7b0 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
1e7c0 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
1e7d0 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
1e7e0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
1e7f0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1e800 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
1e810 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
1e820 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
1e830 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
1e840 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
1e850 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
1e860 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
1e870 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
1e880 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
1e890 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
1e8a0 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
1e8b0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
1e8c0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1e8d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1e8e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1e8f0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
1e900 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
1e910 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
1e920 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
1e930 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
1e940 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
1e950 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 0;.    }else
1e960 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
1e970 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
1e980 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
1e990 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
1e9a0 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
1e9b0 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
1e9c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e9d0 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
1e9e0 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
1e9f0 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
1ea00 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  hname);.    }.. 
1ea10 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
1ea20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ea30 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
1ea40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ea50 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
1ea60 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1ea70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1ea80 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
1ea90 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
1eaa0 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
1eab0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
1eac0 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
1ead0 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
1eae0 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
1eaf0 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
1eb00 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
1eb10 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
1eb20 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
1eb30 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
1eb40 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
1eb50 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
1eb60 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
1eb70 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
1eb80 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
1eb90 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
1eba0 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
1ebb0 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
1ebc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1ebd0 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20  ANTOPEN;.    }. 
1ebe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ebf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1ec00 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
1ec10 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
1ec20 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ec30 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
1ec40 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
1ec50 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
1ec60 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
1ec70 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
1ec80 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
1ec90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1eca0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1ecb0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
1ecc0 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
1ecd0 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
1ece0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1ecf0 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
1ed00 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1ed10 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
1ed20 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
1ed30 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
1ed40 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1ed50 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1ed60 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
1ed70 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
1ed80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
1ed90 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
1eda0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
1edb0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
1edc0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
1edd0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
1ede0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1edf0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1ee00 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
1ee10 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
1ee20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1ee30 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1ee40 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
1ee50 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
1ee60 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
1ee70 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
1ee80 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
1eea0 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
1eeb0 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
1eec0 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
1eed0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
1eee0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
1eef0 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
1ef00 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1ef10 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1ef20 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
1ef30 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
1ef40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
1ef50 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
1ef60 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
1ef70 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
1ef80 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
1ef90 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
1efa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1efb0 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
1efc0 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
1efd0 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
1efe0 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
1eff0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
1f000 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
1f010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
1f020 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20  ournal */.  );. 
1f030 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1f040 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6a 6f  YTE_ALIGNMENT(jo
1f050 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 20 29  urnalFileSize) )
1f060 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
1f070 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1f080 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
1f090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f0a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
1f0b0 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
1f0c0 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
1f0d0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
1f0e0 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
1f0f0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
1f100 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
1f110 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
1f120 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
1f130 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
1f140 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
1f150 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
1f160 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
1f170 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
1f180 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
1f190 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
1f1a0 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
1f1b0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
1f1c0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
1f1d0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
1f1e0 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
1f1f0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
1f200 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
1f210 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1f220 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
1f230 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
1f240 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
1f250 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
1f260 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
1f270 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
1f280 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
1f290 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
1f2a0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1f2b0 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
1f2c0 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
1f2d0 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   1);.    memcpy(
1f2e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f2f0 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
1f300 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1f310 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
1f320 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
1f330 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
1f340 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1f350 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
1f360 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
1f370 22 2c 20 38 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 8);.    sqlit
1f380 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
1f390 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
1f3a0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
1f3b0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
1f3c0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
1f3d0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
1f3e0 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
1f3f0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
1f400 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
1f410 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
1f420 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
1f450 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
1f460 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1f470 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1f480 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f490 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
1f4a0 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
1f4b0 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
1f4c0 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
1f4d0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
1f4e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
1f4f0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
1f500 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
1f510 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
1f520 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
1f530 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
1f540 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
1f550 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
1f560 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1f570 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
1f580 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
1f590 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
1f5a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f5b0 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
1f5c0 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
1f5d0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
1f5e0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1f5f0 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
1f600 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
1f610 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
1f620 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
1f630 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
1f640 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
1f650 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f660 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
1f670 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63   ){.      setSec
1f680 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1f690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51  .      assert(SQ
1f6a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1f6b0 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
1f6c0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f6d0 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIZE);.      if(
1f6e0 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
1f6f0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
1f700 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1f710 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1f720 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
1f730 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
1f740 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
1f750 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
1f760 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f770 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65  SIZE;.        }e
1f780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1f790 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36  zPageDflt = (u16
1f7a0 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
1f7b0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ize;.        }. 
1f7c0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
1f7d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
1f7e0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b  IC_WRITE.      {
1f7f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63  .        int iDc
1f800 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
1f810 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f820 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
1f830 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
1f840 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
1f850 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f860 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
1f870 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f880 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1f890 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
1f8a0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
1f8b0 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
1f8c0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1f8d0 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
1f8e0 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
1f8f0 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
1f900 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1f910 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
1f920 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1f930 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
1f940 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
1f950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f960 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
1f970 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1f990 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65  endif.    }.  }e
1f9a0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
1f9b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1f9c0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
1f9d0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
1f9e0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
1f9f0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
1fa00 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
1fa10 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
1fa20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
1fa30 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
1fa40 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
1fa50 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
1fa60 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
1fa70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1fa80 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
1fa90 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
1faa0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
1fab0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
1fac0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
1fad0 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
1fae0 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
1faf0 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
1fb00 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
1fb10 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
1fb20 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
1fb30 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
1fb40 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
1fb50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1fb60 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1fb70 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  USIVE;.  }..  /*
1fb80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1fb90 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
1fba0 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
1fbb0 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
1fbc0 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
1fbd0 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
1fbe0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
1fbf0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
1fc00 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
1fc10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fc20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1fc30 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
1fc40 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1fc50 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1fc60 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
1fc70 67 65 44 66 6c 74 29 3b 0a 20 20 20 20 74 65 73  geDflt);.    tes
1fc80 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1fc90 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
1fca0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1fcb0 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72  curred in either
1fcc0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
1fcd0 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a  bove, free the .
1fce0 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63    ** Pager struc
1fcf0 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
1fd00 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
1fd10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fd20 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1fd30 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
1fd40 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ace );.    sqlit
1fd50 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1fd60 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
1fd70 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
1fd80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1fd90 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
1fda0 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
1fdb0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 6e 45 78  object. */.  nEx
1fdc0 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
1fdd0 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tra);.  sqlite3P
1fde0 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
1fdf0 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
1fe00 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
1fe10 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
1fe20 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
1fe30 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1fe40 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1fe50 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
1fe60 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
1fe70 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
1fe80 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
1fe90 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
1fea0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
1feb0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
1fec0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
1fed0 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
1fee0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
1fef0 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
1ff00 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
1ff10 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63  ock = (noReadloc
1ff20 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f  k && readOnly) ?
1ff30 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  1:0;.  /* pPager
1ff40 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
1ff50 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
1ff60 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
1ff70 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
1ff80 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
1ff90 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
1ffa0 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  d = (u8)memDb;. 
1ffb0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
1ffc0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
1ffd0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
1ffe0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
1fff0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
20000 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
20010 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
20020 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
20030 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20040 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
20050 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  CK; */.  assert(
20060 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
20070 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
20080 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
20090 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
200a0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
200b0 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
200c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
200d0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
200e0 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
200f0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
20100 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
20110 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
20120 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
20130 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
20140 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
20150 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
20160 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
20170 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
20180 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
20190 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
201a0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
201b0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
201c0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
201d0 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
201e0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
201f0 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
20200 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
20210 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
20220 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
20230 6e 6f 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  noSync = (pPager
20240 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75  ->tempFile || !u
20250 73 65 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30 3b  seJournal) ?1:0;
20260 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
20270 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ync = pPager->no
20280 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61  Sync ?0:1;.  pPa
20290 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
202a0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
202b0 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  RMAL;.  /* pPage
202c0 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
202d0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
202e0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
202f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20300 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
20310 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
20320 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  = nExtra;.  pPag
20330 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
20340 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
20350 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
20360 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
20370 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20380 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
20390 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
203a0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
203b0 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
203c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
203d0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
203e0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
203f0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
20400 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
20410 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20420 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
20430 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  rArg = 0; */.  /
20440 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
20450 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
20460 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
20470 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
20480 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
20490 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
204a0 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ..../*.** This f
204b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
204c0 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
204d0 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
204e0 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
204f0 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
20500 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
20510 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
20520 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
20530 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
20540 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
20550 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
20560 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
20570 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
20580 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
20590 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
205a0 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
205b0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
205c0 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
205d0 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
205e0 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
205f0 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
20600 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
20610 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
20620 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
20630 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
20640 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
20650 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
20660 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
20670 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
20680 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
20690 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
206a0 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
206b0 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
206c0 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
206d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
206e0 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
206f0 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
20700 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
20710 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20720 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
20730 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
20740 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
20750 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
20760 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
20770 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
20780 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
20790 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
207a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
207b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
207c0 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
207d0 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
207e0 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
207f0 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
20800 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
20810 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
20820 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
20830 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
20840 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
20850 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
20860 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
20870 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
20880 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
20890 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
208a0 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
208b0 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
208c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
208d0 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
208e0 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
208f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
20900 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
20910 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
20920 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
20930 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
20940 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
20950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
20960 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
20970 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
20980 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
20990 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
209a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
209b0 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
209c0 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
209d0 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
209e0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
209f0 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
20a00 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
20a10 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
20a20 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
20a30 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
20a40 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
20a50 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
20a60 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
20a70 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
20a80 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
20a90 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
20aa0 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
20ab0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
20ac0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
20ad0 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
20ae0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
20af0 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
20b00 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
20b10 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
20b20 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
20b30 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
20b40 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
20b50 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20b70 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20b80 20 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20    int exists;   
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ba0 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
20bb0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
20bc0 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sent */..  asser
20bd0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
20be0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20bf0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
20c00 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
20c10 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
20c20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
20c30 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
20c40 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
20c50 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
20c60 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
20c70 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
20c80 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
20c90 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
20ca0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20cb0 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
20cc0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
20cd0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
20ce0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
20cf0 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
20d00 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
20d10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
20d20 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
20d30 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
20d40 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
20d50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20d60 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
20d70 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
20d80 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  e;..      /* Che
20d90 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
20da0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20db0 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
20dc0 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
20dd0 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
20de0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
20df0 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
20e00 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
20e10 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
20e20 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
20e30 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
20e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20e50 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
20e60 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
20e70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20e80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20e90 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
20ea0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20eb0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
20ec0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
20ed0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
20ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
20f00 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
20f10 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
20f20 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
20f30 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
20f40 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
20f50 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20f60 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
20f70 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
20f80 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
20f90 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
20fa0 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
20fb0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
20fc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
20fd0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
20fe0 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
20ff0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
21000 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
21010 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
21020 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
21030 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
21040 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
21050 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
21060 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
21070 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
21080 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
21090 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
210a0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
210b0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
210c0 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
210d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
210e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
210f0 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
21100 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
21110 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21120 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
21130 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
21140 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
21150 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
21160 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
21170 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
21180 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
21190 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
211a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
211b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
211c0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
211d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
211e0 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
211f0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
21200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21210 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
21220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21230 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
21240 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
21250 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
21260 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
21270 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
21280 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
21290 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
212a0 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
212b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
212c0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
212d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
212e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
212f0 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
21300 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
21310 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
21320 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
21330 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
21340 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21350 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
21360 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
21370 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
21380 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
21390 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
213a0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
213b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
213c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
213d0 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
213e0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
213f0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
21400 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
21410 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
21420 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
21430 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
21440 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
21450 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
21460 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
21470 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
21480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21490 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
214a0 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20  64 iOffset;     
214b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
214c0 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66 69  yte offset of fi
214d0 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
214e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
214f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
21500 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45  ER_SHARED && !ME
21510 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21 69  MDB );..  if( !i
21520 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
21530 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
21540 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21550 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e );.    memset(
21560 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
21570 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21580 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21590 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f  ITE_OK;.  }.  iO
215a0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
215b0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
215c0 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  geSize;.  rc = s
215d0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
215e0 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44  ger->fd, pPg->pD
215f0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
21600 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b  eSize, iOffset);
21610 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21620 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
21630 41 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  AD ){.    rc = S
21640 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21650 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
21660 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
21670 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
21680 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
21690 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
216a0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
216b0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
216c0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
216d0 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43  s));.  }.  CODEC
216e0 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
216f0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a  Data, pgno, 3);.
21700 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
21710 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
21720 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
21730 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
21740 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
21750 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
21760 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
21770 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
21780 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
21790 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
217a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
217b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
217c0 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
217d0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
217e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
217f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
21800 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
21810 65 6e 65 76 65 72 20 74 68 65 20 75 70 70 65 72  enever the upper
21820 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 73 20   layer requests 
21830 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61  a database.** pa
21840 67 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ge is requested,
21850 20 62 65 66 6f 72 65 20 74 68 65 20 63 61 63 68   before the cach
21860 65 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  e is checked for
21870 20 61 20 73 75 69 74 61 62 6c 65 20 70 61 67 65   a suitable page
21880 0a 2a 2a 20 6f 72 20 61 6e 79 20 64 61 74 61 20  .** or any data 
21890 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
218a0 20 64 61 74 61 62 61 73 65 2e 20 49 74 20 70 65   database. It pe
218b0 72 66 6f 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f  rforms the follo
218c0 77 69 6e 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63  wing.** two func
218d0 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tions:.**.**   1
218e0 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
218f0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
21900 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
21910 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
21920 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
21930 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
21940 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
21950 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
21960 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
21970 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
21980 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
21990 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
219a0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
219b0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
219c0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
219d0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
219e0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
219f0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
21a00 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
21a10 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
21a20 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
21a30 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
21a40 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
21a50 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
21a60 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
21a70 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
21a80 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
21a90 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
21aa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21ab0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
21ac0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
21ad0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
21ae0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
21af0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
21b00 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
21b10 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
21b20 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
21b30 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
21b40 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
21b50 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
21b60 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
21b70 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
21b80 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
21b90 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
21ba0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
21bb0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
21bc0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
21bd0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
21be0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
21bf0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
21c00 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
21c10 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
21c20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
21c30 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65  the operation de
21c40 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61  scribed by (2) a
21c50 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65  bove is not atte
21c60 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68  mpted, and if th
21c70 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e  e.** pager is in
21c80 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
21c90 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
21ca0 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73  E_FULL when this
21cb0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74   is called,.** t
21cc0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
21cd0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
21ce0 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72  urned. It is per
21cf0 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74  mitted to read t
21d00 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  he.** database w
21d10 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55  hen in SQLITE_FU
21d20 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  LL error state..
21d30 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
21d40 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
21d50 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
21d60 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21d70 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f  ned. If an.** IO
21d80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
21d90 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
21da0 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
21db0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
21dc0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20  rnal.** file or 
21dd0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
21de0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
21df0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
21e00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
21e10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
21e20 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
21e30 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
21e40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
21e70 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65  .  int isErrorRe
21e80 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
21e90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21ea0 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d   recovering from
21eb0 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
21ec0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
21ed0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
21ee0 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
21ef0 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75  ccess, has no ou
21f00 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
21f10 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  page references 
21f20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72  and is in an err
21f30 6f 72 2d 73 74 61 74 65 2c 20 74 68 69 73 20 69  or-state, this i
21f40 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  s a chance to cl
21f50 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
21f60 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
21f70 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
21f80 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
21f90 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f  treat any.  ** o
21fa0 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
21fb0 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
21fc0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d  l..  */.  if( !M
21fd0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
21fe0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
21ff0 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
22000 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22010 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26  r->pPCache)==0 &
22020 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
22030 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  e .  ){.    if( 
22040 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
22050 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 73 45  fd) ){.      isE
22060 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
22070 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
22080 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
22090 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
220a0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
220b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
220c0 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69  pager is still i
220d0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
220e0 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  , do not proceed
220f0 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a  . The error .  *
22100 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20  * state will be 
22110 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20  cleared at some 
22120 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
22130 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67  ure when all pag
22140 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  e .  ** referenc
22150 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61  es are dropped a
22160 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e  nd the cache can
22170 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
22180 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
22190 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
221a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
221b0 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
221c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
221d0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
221e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
221f0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
22200 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
22210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
22220 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
22230 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
22240 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
22250 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  rnal = 0;.    as
22260 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
22270 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
22280 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
22290 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
222a0 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
222b0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
222c0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63  lock ){.      rc
222d0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
222e0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
222f0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
22300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
22320 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
22330 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
22340 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
22350 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
22360 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
22370 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
22380 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
22390 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
223a0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
223b0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
223c0 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  HARED;.    }.   
223d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
223e0 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
223f0 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  OCK );..    /* I
22400 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
22410 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
22420 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
22430 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
22440 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
22450 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
22460 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
22470 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
22480 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
22490 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65    if( !isErrorRe
224a0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  set ){.      rc 
224b0 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
224c0 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f  pPager, &isHotJo
224d0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
224e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
224f0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
22500 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
22510 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
22520 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73  ErrorReset || is
22530 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
22540 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
22550 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
22560 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22570 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
22580 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
22590 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
225a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
225b0 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
225c0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
225d0 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
225e0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
225f0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
22600 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
22610 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
22620 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
22630 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
22640 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
22650 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
22660 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
22670 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
22680 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
22690 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
226a0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
226b0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
226c0 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
226d0 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
226e0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
226f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
22700 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
22710 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
22720 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
22730 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
22740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22750 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
22760 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
22770 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
22780 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
22790 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
227a0 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
227b0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
227c0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
227d0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
227e0 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49  r->state<EXCLUSI
227f0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
22800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22810 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
22820 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
22830 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
22840 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22850 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
22860 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
22870 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
22880 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
22890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
228a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
228b0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
228c0 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
228d0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
228e0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
228f0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
22900 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
22910 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
22920 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
22930 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22940 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
22950 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
22960 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  ** possibly used
22970 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
22980 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20  on later on. On 
22990 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68  some systems, th
229a0 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75  e.      ** OsTru
229b0 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
229c0 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
229d0 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
229e0 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
229f0 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
22a00 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
22a10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
22a20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
22a30 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fd) ){.        i
22a40 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
22a50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
22a60 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72  cess(pVfs,pPager
22a70 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54  ->zJournal,SQLIT
22a80 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
22a90 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
22aa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
22ac0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
22ad0 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
22ae0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
22af0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
22b00 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
22b10 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
22b20 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
22b30 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
22b40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
22b50 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22b60 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
22b70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
22b80 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
22b90 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
22ba0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
22bb0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22bc0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
22bd0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
22be0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
22bf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
22c00 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
22c10 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
22c20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22c30 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
22c40 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22c50 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
22c60 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
22c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22c80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22c90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
22ca0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
22cb0 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ist, that means 
22cc0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
22cd0 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ss.            *
22ce0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f  * has already ro
22cf0 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a  lled it back */.
22d00 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22d10 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
22d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22d30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22d40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22d50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
22d60 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
22d70 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f    }..      /* TO
22d80 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65 73  DO: Why are thes
22d90 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20  e cleared here? 
22da0 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f  Is it necessary?
22db0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
22dc0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
22dd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
22de0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
22df0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
22e00 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
22e10 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
22e20 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
22e30 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
22e40 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
22e50 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
22e60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
22e70 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
22e80 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
22e90 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
22ea0 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
22eb0 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
22ec0 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
22ed0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
22ee0 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
22ef0 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
22f00 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
22f10 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  t cache..      *
22f20 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
22f30 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
22f40 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  er, 1);.      if
22f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22f60 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22f70 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
22f80 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
22f90 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
22fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
22fb0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  rt( (pPager->sta
22fc0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
22fd0 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
22fe0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
22ff0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
23000 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
23010 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20  ARED).      );. 
23020 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
23030 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
23040 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
23050 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20  ache)>0 ){.     
23060 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
23070 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
23080 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
23090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
230a0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
230b0 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
230c0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
230d0 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
230e0 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
230f0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
23100 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
23110 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
23120 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
23130 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
23140 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
23150 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
23160 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
23170 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
23180 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
23190 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
231a0 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
231b0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
231c0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
231d0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
231e0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
231f0 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
23200 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
23210 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
23220 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
23230 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
23240 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
23250 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
23260 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
23270 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
23280 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
23290 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
232a0 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
232b0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
232c0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
232d0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
232e0 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
232f0 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
23300 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
23310 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
23320 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
23330 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
23340 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
23350 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
23360 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
23370 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64   */.      char d
23380 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
23390 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
233a0 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ers)];.      sql
233b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
233c0 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a  nt(pPager, 0);..
233d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
233e0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
233f0 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
23400 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
23410 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
23420 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
23430 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
23440 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
23450 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23460 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
23470 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
23480 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
23490 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
234a0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
234b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
234c0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
234d0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
234e0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
234f0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
23500 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23520 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
23530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
23540 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
23550 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
23560 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
23570 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
23580 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
23590 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
235a0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
235b0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
235c0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
235d0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
235e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
235f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23600 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  t( pPager->exclu
23610 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
23620 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
23630 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a  _SHARED );.  }..
23640 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
23650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23660 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c      /* pager_unl
23670 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
23680 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d   for exclusive m
23690 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72  ode and in-memor
236a0 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  y databases. */.
236b0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
236c0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
236d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
236e0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
236f0 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
23700 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
23710 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
23720 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
23730 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
23740 61 67 65 72 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ager..*/ .static
23750 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
23760 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
23770 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
23780 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
23790 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
237a0 43 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Cache)==0 ){.   
237b0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
237c0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
237d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72  .  }.}../*.** Dr
237e0 6f 70 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  op a page from t
237f0 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 73  he cache using s
23800 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
23810 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ()..**.** If thi
23820 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  s means there ar
23830 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77  e now no pages w
23840 69 74 68 20 72 65 66 65 72 65 6e 63 65 73 20 74  ith references t
23850 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61  o them, a rollba
23860 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64  ck.** occurs and
23870 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
23880 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 6d   database is rem
23890 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oved..*/.static 
238a0 76 6f 69 64 20 70 61 67 65 72 44 72 6f 70 50 61  void pagerDropPa
238b0 67 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ge(DbPage *pPg){
238c0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
238d0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
238e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
238f0 72 6f 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65  rop(pPg);.  page
23900 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
23910 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
23920 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
23930 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
23940 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
23950 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
23960 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
23970 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
23980 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
23990 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
239a0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
239b0 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
239c0 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
239d0 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
239e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
239f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
23a00 61 6c 6c 73 20 70 61 67 65 72 53 68 61 72 65 64  alls pagerShared
23a10 4c 6f 63 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e  Lock() to obtain
23a20 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
23a30 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
23a40 65 20 66 69 6c 65 20 69 66 20 73 75 63 68 20 61  e file if such a
23a50 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
23a60 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
23a70 68 65 6c 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 61  held..** This ma
23a80 79 20 63 61 75 73 65 20 68 6f 74 2d 6a 6f 75 72  y cause hot-jour
23a90 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
23aa0 61 20 63 61 63 68 65 20 70 75 72 67 65 2e 20 53  a cache purge. S
23ab0 65 65 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 61  ee comments.** a
23ac0 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 70 61  bove function pa
23ad0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
23ae0 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
23af0 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
23b00 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
23b10 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
23b20 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
23b30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
23b40 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
23b50 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
23b60 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
23b70 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
23b80 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
23b90 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
23ba0 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
23bb0 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
23bc0 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
23bd0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
23be0 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
23bf0 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
23c00 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
23c10 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
23c20 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
23c30 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
23c40 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
23c50 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
23c60 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
23c70 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
23c80 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
23c90 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
23ca0 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
23cb0 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
23cc0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
23cd0 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
23ce0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
23cf0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
23d00 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
23d10 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
23d20 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
23d30 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
23d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
23d50 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
23d60 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
23d70 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
23d80 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
23d90 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
23da0 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
23db0 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
23dc0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
23dd0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
23de0 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
23df0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
23e00 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
23e10 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
23e20 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
23e30 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
23e40 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
23e50 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
23e60 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
23e70 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
23e80 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
23e90 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
23ea0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
23eb0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
23ec0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
23ed0 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
23ee0 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69  seperate scenari
23ef0 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
23f00 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
23f10 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
23f20 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
23f30 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
23f40 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
23f50 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
23f60 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
23f70 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
23f80 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
23f90 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
23fa0 74 6f 20 70 6f 70 75 6c 61 74 65 20 77 69 74 68  to populate with
23fb0 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
23fc0 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
23fd0 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
23fe0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  l..**.** If noCo
23ff0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ntent is true, t
24000 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74  hen the data ret
24010 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20  urned is zeroed 
24020 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65  instead of.** be
24030 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ing read from th
24040 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
24050 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69  tionally, the bi
24060 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ts corresponding
24070 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50  .** to pgno in P
24080 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
24090 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73  (bitvec of pages
240a0 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
240b0 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   to the.** journ
240c0 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
240d0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
240e0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
240f0 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e  vecs of any open
24100 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61  .** savepoints a
24110 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61  re set. This mea
24120 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ns if the page i
24130 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  s made writable 
24140 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20  at any.** point 
24150 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75  in the future, u
24160 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73  sing a call to s
24170 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24180 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  (), its contents
24190 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  .** will not be 
241a0 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20  journaled. This 
241b0 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20  saves IO..**.** 
241c0 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
241d0 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
241e0 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
241f0 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
24200 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
24210 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
24220 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
24230 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
24240 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
24250 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
24260 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
24270 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
24280 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
24290 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
242a0 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
242b0 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
242c0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
242d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
242e0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
242f0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
24300 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
24310 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
24320 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
24330 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
24340 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
24350 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
24360 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
24370 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
24380 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
24390 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
243a0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
243b0 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
243c0 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
243d0 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
243e0 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
243f0 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
24400 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
24410 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24420 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
24430 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
24440 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
24450 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
24460 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
24470 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
24480 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
24490 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
244a0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
244b0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
244c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
244d0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
244e0 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
244f0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
24500 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
24510 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
24520 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  true */.){.  PgH
24530 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69  dr *pPg = 0;.  i
24540 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
24550 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
24560 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
24570 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24580 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
24590 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c  NLOCK .       ||
245a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
245b0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
245c0 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20  PCache)>0 .     
245d0 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29    || pgno==1.  )
245e0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
245f0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
24600 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
24610 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
24620 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
24630 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
24640 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
24650 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
24660 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
24670 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
24680 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
24690 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
246a0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
246b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
246c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
246d0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
246e0 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
246f0 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
24700 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
24710 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
24720 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
24730 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
24740 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
24750 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
24760 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
24770 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
24780 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65  abase file. page
24790 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73  rSharedLock() is
247a0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a   a no-op if .  *
247b0 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63  * a database loc
247c0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
247d0 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  d..  */.  rc = p
247e0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
247f0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
24800 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24810 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24820 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
24830 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
24840 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63  _UNLOCK );..  rc
24850 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
24860 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
24870 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20  Cache, pgno, 1, 
24880 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21  &pPg);.  if( rc!
24890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
248a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
248b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
248c0 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
248d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
248e0 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70  ger==pPager || p
248f0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  Pg->pPager==0 );
24900 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67  .  if( pPg->pPag
24910 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  er==0 ){.    /* 
24920 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  The pager cache 
24930 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65  has created a ne
24940 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74  w page. Its cont
24950 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20  ent needs to .  
24960 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69    ** be initiali
24970 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  zed..    */.    
24980 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41  int nMax;.    PA
24990 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
249a0 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67  >nMiss);.    pPg
249b0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
249c0 72 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r;..    rc = sql
249d0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
249e0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78  nt(pPager, &nMax
249f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
24a00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24a10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
24a20 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
24a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
24a40 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28  ..    if( nMax<(
24a50 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44  int)pgno || MEMD
24a60 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29  B || noContent )
24a70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
24a80 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
24a90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24aa0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
24ab0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
24ac0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
24ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
24ae0 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
24af0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
24b00 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
24b10 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
24b20 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
24b30 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
24b40 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
24b50 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
24b60 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
24b70 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
24b80 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
24b90 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
24ba0 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
24bb0 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
24bc0 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
24bd0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
24be0 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
24bf0 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
24c00 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
24c10 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
24c20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
24c30 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
24c40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24c50 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
24c60 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
24c70 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
24c80 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
24c90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
24ca0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
24cb0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
24cc0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
24cd0 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
24ce0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
24d00 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
24d10 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
24d20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
24d30 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
24d40 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
24d50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
24d60 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
24d70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24d80 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
24d90 28 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ();.      }else{
24da0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
24db0 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
24dc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
24dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24de0 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
24df0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
24e00 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
24e10 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
24e20 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
24e30 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72  Pager );.      r
24e40 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
24e50 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
24e60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24e70 20 20 20 20 20 20 20 20 70 61 67 65 72 44 72 6f          pagerDro
24e80 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  pPage(pPg);.    
24e90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24ea0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
24eb0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
24ec0 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
24ed0 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
24ee0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
24ef0 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
24f00 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
24f10 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
24f20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
24f30 2a 2f 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  */.    PAGER_INC
24f40 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
24f50 0a 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20  .  }..  *ppPage 
24f60 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
24f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
24f80 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
24f90 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
24fa0 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
24fb0 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
24fc0 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
24fd0 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
24fe0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
24ff0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
25000 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
25010 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
25020 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e  he. Also, return
25030 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61   0 if the .** pa
25040 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
25050 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
25060 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
25070 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72  is called,.** or
25080 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
25090 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
250a0 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
250b0 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  LITE_FULL..**.**
250c0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
250d0 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
250e0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
250f0 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
25100 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
25110 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
25120 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
25130 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
25140 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
25150 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
25160 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
25170 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
25180 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
25190 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
251a0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
251b0 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
251c0 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
251d0 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
251e0 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
251f0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
25200 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25210 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
25220 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
25230 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
25240 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
25250 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28  gno!=0 );..  if(
25260 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21   (pPager->state!
25270 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20  =PAGER_UNLOCK). 
25280 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72    && (pPager->er
25290 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
252a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
252b0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
252c0 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
252d0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
252e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
252f0 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
25300 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67   }..  return pPg
25310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
25320 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
25330 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
25340 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
25350 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
25360 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
25370 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
25380 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
25390 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
253a0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
253b0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
253c0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
253d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
253e0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
253f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
25400 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
25410 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25420 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
25430 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
25440 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
25450 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
25460 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
25470 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
25480 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
25490 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
254a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
254b0 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
254c0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72  nal file has alr
254d0 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
254e0 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  , ensure that th
254f0 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  e.** sub-journal
25500 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f   file is open to
25510 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a  o. If the main j
25520 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70  ournal is not op
25530 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en,.** this func
25540 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
25550 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
25560 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
25570 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
25580 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
25590 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45  n. .** An SQLITE
255a0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
255b0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
255c0 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a  d if a call to .
255d0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  ** sqlite3OsOpen
255e0 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  () fails..*/.sta
255f0 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
25600 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
25610 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
25620 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
25630 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
25640 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
25650 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
25660 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
25670 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
25680 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
25690 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
256a0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
256b0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
256c0 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
256d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
256e0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
256f0 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
25700 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
25710 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
25720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
25740 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
25750 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
25760 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
25770 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
25780 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
25790 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
257a0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
257b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
257c0 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
257d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
257e0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
257f0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
25800 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
25810 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
25820 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
25830 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
25840 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
25850 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
25860 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
25870 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
25880 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
25890 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
258a0 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
258b0 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
258c0 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
258d0 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
258e0 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
258f0 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
25900 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
25910 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
25920 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
25930 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
25940 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
25950 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
25960 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
25970 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
25980 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
25990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
259a0 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
259b0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
259c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
259d0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
259e0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
259f0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
25a00 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
25a10 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
25a20 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
25a30 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
25a40 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
25a50 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
25a60 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
25a70 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
25a80 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
25a90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
25aa0 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
25ab0 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
25ac0 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
25ad0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
25ae0 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
25af0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
25b00 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
25b10 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
25b20 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
25b30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
25b40 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
25b50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25b60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25b70 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
25b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25b90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
25ba0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
25bb0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
25bc0 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
25bd0 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
25be0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
25bf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
25c00 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
25c10 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
25c20 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
25c30 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
25c40 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
25c50 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
25c60 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
25c70 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
25c80 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
25c90 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
25ca0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
25cb0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
25cc0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
25cd0 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f  de;.  }..  /* TO
25ce0 44 4f 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79  DO: Is it really
25cf0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74   possible to get
25d00 20 68 65 72 65 20 77 69 74 68 20 64 62 53 69 7a   here with dbSiz
25d10 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f  eValid==0? If no
25d20 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c  t,.  ** the call
25d30 20 74 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75   to PagerPagecou
25d40 6e 74 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f  nt() can be remo
25d50 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ved..  */.  test
25d60 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62  case( pPager->db
25d70 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
25d80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
25d90 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
25da0 30 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70  0);..  pPager->p
25db0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
25dc0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
25dd0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
25de0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
25df0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
25e00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25e10 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
25e20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
25e30 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
25e40 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
25e50 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  en. */.  if( !is
25e60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
25e70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
25e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
25e90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
25ea0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
25eb0 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
25ec0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
25ed0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
25ee0 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  e{.      const i
25ef0 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20  nt flags =      
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f10 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  VFS flags to ope
25f20 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
25f30 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
25f40 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
25f50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
25f60 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61  TE|.        (pPa
25f70 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20  ger->tempFile ? 
25f80 0a 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49  .          (SQLI
25f90 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
25fa0 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
25fb0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a  N_TEMP_JOURNAL):
25fc0 0a 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49  .          (SQLI
25fd0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
25fe0 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b  RNAL).        );
25ff0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
26000 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
26010 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  TE.      rc = sq
26020 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
26030 28 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73  (.          pVfs
26040 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
26050 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
26060 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
26070 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
26080 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
26090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
260a0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
260b0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
260c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
260d0 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
260e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
260f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
26100 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
26110 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  jfd) );.  }...  
26120 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
26130 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
26140 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
26150 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
26160 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
26170 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
26180 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  y..  */.  if( rc
26190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
261a0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
261b0 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
261c0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
261d0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50  uired. */.    pP
261e0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
261f0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
26200 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e;.    pPager->j
26210 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
26220 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
26230 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
26240 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
26250 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
26260 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
26270 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
26280 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  ster = 0;.    pP
26290 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
262a0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77   = 0;.    rc = w
262b0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
262c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
262d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
262e0 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
262f0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20  point ){.    rc 
26300 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
26310 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
26320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26330 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
26340 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
26350 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
26360 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
26370 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
26380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
263a0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
263b0 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
263c0 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
263d0 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
263e0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
263f0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
26400 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
26410 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
26420 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
26430 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
26440 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
26450 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
26460 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
26470 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
26480 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
26490 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
264a0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
264b0 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
264c0 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
264d0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
264e0 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
264f0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
26500 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
26510 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
26520 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
26530 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
26540 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e  e and, the journ
26550 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f  al file is .** o
26560 70 65 6e 65 64 20 69 66 20 69 74 20 68 61 73 20  pened if it has 
26570 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79  not been already
26580 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  . For a temporar
26590 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e  y file, the open
265a0 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  ing .** of the j
265b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
265c0 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
265d0 65 72 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c  ere is an actual
265e0 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69   need to .** wri
265f0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
26600 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e  l. TODO: Why han
26610 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  dle temporary fi
26620 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f  les differently?
26630 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
26640 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
26650 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74 20 69  ened (or if it i
26660 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
26670 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e   then a.** journ
26680 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69  al-header is wri
26690 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72  tten to the star
266a0 74 20 6f 66 20 69 74 2e 0a 2a 2f 0a 69 6e 74 20  t of it..*/.int 
266b0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
266c0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
266d0 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
266e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
266f0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
26700 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
26710 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
26720 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
26730 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
26740 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
26750 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
26760 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
26770 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50  t( !MEMDB && !pP
26780 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
26790 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  ;..    /* Obtain
267a0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
267b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
267c0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
267d0 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
267e0 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
267f0 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
26800 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
26810 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
26820 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75  k. The.    ** bu
26830 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
26840 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
26850 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
26860 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
26870 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
26880 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
26890 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
268a0 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
268b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
268c0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
268d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
268e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
268f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26900 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
26910 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
26920 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
26930 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
26940 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
26950 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
26960 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
26970 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
26980 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 69 72  /* If the requir
26990 65 64 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75  ed locks were su
269a0 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
269b0 6e 65 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f  ned, open the jo
269c0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
269d0 65 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  e and write the 
269e0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
269f0 61 64 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20  ader to it..    
26a00 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
26a10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
26a20 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20  er->useJournal. 
26a30 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
26a40 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
26a50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
26a60 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  F .    ){.      
26a70 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
26a80 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
26a90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
26aa0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
26ab0 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
26ac0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
26ad0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
26ae0 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20  appens when the 
26af0 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63  pager was in exc
26b00 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
26b10 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  de the last.    
26b20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
26b30 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
26b40 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
26b50 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
26b60 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
26b70 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
26b80 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
26b90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26ba0 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
26bb0 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69  kept open and ei
26bc0 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74  ther was truncat
26bd0 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72  ed to 0 bytes or
26be0 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a   its header was.
26bf0 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74      ** overwritt
26c00 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  en with zeros.. 
26c10 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
26c20 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
26c30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
26c40 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
26c50 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
26c60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
26c70 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
26c80 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
26c90 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
26ca0 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  r);.  }..  PAGER
26cb0 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
26cc0 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
26cd0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
26ce0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
26cf0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
26d00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26d10 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
26d20 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
26d30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
26d40 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74  ark a single dat
26d50 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
26d60 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ble. The page is
26d70 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
26d80 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e  e .** main journ
26d90 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
26da0 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49  l as required. I
26db0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
26dc0 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e  itten into.** on
26dd0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
26de0 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  s, the correspon
26df0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
26e00 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72  in the .** Pager
26e10 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
26e20 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  ec and the Pager
26e30 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
26e40 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a  epoint bitvecs.*
26e50 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61  * of any open sa
26e60 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72  vepoints as appr
26e70 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
26e80 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
26e90 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
26ea0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
26eb0 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61  pPg->pData;.  Pa
26ec0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
26ed0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
26ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26ef0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
26f00 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
26f10 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
26f20 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
26f30 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
26f40 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
26f50 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
26f60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26f70 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
26f80 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
26f90 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
26fa0 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
26fb0 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
26fc0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
26fd0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
26fe0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
26ff0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
27000 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
27010 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
27020 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
27030 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
27040 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
27050 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
27060 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
27070 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
27080 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
27090 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
270a0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
270b0 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
270c0 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
270d0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
270e0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
270f0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
27100 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
27110 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
27120 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
27130 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
27140 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
27150 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
27160 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
27170 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
27180 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
27190 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
271a0 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
271b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
271c0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
271d0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
271e0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
271f0 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
27200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
27220 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
27230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27240 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
27250 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
27260 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
27270 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
27280 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  r->useJournal.  
27290 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
272a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
272b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
272c0 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72  E_OFF ){.      r
272d0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
272e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
272f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27300 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
27310 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
27320 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
27330 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  d = 1;.  .    /*
27340 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
27350 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
27360 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
27370 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
27380 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
27390 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
273a0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
273b0 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
273c0 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
273d0 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
273e0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
273f0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
27400 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
27410 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
27420 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73  urnal(pPg) && is
27430 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27440 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
27450 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
27460 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
27470 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
27480 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
27490 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20  *pData2;..      
274a0 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
274b0 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
274c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
274d0 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
274e0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
274f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
27500 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
27510 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
27520 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
27530 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
27540 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
27550 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
27560 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
27570 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  r) );.        pD
27580 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
27590 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
275a0 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
275b0 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
275c0 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
275d0 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
275e0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
275f0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
27600 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
27610 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  nalOff, pPg->pgn
27620 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
27630 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27650 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
27660 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
27670 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
27680 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
276b0 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
276c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
276d0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
276e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
276f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27700 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27720 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
27730 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
27740 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
27750 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
27760 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
27770 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
27780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27790 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
277a0 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
277b0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
277c0 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
277d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
277e0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
277f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
27800 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
27810 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
27820 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
27830 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
27840 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
27850 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
27860 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
27870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
27880 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
27890 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
278a0 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
278b0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
278c0 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
278d0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
278e0 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ));..        /* 
278f0 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
27900 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
27910 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a  occurred while j
27920 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
27930 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
27940 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
27950 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
27960 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
27970 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
27980 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
27990 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
279a0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
279b0 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
279c0 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
279d0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
279e0 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
279f0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
27a00 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
27a10 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
27a20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
27a30 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
27a40 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
27a50 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
27a60 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
27a70 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
27a80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27a90 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
27aa0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
27ab0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
27ac0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
27ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
27ae0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
27af0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
27b00 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72       /* An error
27b10 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72   has occurred wr
27b20 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
27b30 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a  rnal file. The .
27b40 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
27b50 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
27b60 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
27b70 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
27b80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27b90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27ba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27bc0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
27bd0 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
27be0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
27bf0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
27c00 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
27c10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
27c20 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
27c30 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
27c40 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
27c50 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
27c60 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
27c70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
27c80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
27c90 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
27ca0 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61  .        rc |= a
27cb0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
27cc0 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
27cd0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
27ce0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27cf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27d00 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
27d10 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
27d20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
27d30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27d50 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
27d60 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
27d70 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
27d80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
27d90 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
27da0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
27db0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
27dc0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
27dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
27de0 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
27df0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
27e00 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
27e10 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
27e20 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
27e30 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
27e40 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
27e50 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
27e60 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
27e70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
27e80 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
27e90 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
27ea0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
27eb0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
27ec0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
27ed0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
27ee0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
27ef0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
27f00 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
27f10 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
27f20 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
27f30 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
27f40 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
27f50 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
27f60 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
27f70 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
27f80 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
27f90 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52  */.    if( subjR
27fa0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
27fb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27fc0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
27fd0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
27fe0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
27ff0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
28000 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
28010 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28020 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
28030 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  RED );.  if( pPa
28040 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
28050 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
28060 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
28070 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
28080 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28090 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
280a0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
280b0 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
280c0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
280d0 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20  fore .** making 
280e0 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
280f0 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  e. The caller mu
28100 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
28110 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  urn value .** of
28120 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
28130 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
28140 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20  t to change any 
28150 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73  page data unless
28160 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
28170 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
28180 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  _OK..**.** The d
28190 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
281a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
281b0 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
281c0 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
281d0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
281e0 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
281f0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
28200 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
28210 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
28220 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
28230 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
28240 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
28250 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
28260 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
28270 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28280 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
28290 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
282a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
282b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
282c0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
282d0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
282e0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f  s appropriate. O
282f0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
28300 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
28310 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
28320 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
28330 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28340 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
28350 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
28360 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
28370 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
28380 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
28390 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
283a0 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
283b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
283c0 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
283d0 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
283e0 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
283f0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
28400 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
28410 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
28420 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
28450 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
28460 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
28470 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
28480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28490 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
284a0 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
284b0 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
284c0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
284f0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  */.    int needS
28500 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
28510 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
28520 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e  page has PGHDR_N
28530 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20  EED_SYNC */..   
28540 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
28550 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
28560 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
28570 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
28580 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
28590 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
285a0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
285b0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
285c0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
285d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
285e0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
285f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
28600 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
28610 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
28620 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
28630 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
28640 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
28650 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
28660 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
28670 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
28680 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
28690 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
286a0 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
286b0 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
286c0 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
286d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
286e0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
286f0 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
28700 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
28710 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
28720 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
28730 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50  1;..    sqlite3P
28740 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
28750 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
28760 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69  ageCount);.    i
28770 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
28780 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
28790 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
287a0 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
287b0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
287c0 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
287d0 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
287e0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
287f0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
28800 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28810 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
28820 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
28830 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
28840 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
28850 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
28860 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
28870 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
28880 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
28890 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
288a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
288b0 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
288c0 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
288d0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
288e0 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
288f0 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
28900 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
28910 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
28920 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
28930 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
28940 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
28950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
28960 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
28970 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
28980 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
289a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
289b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
289c0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
289d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
289e0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
289f0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
28a00 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
28a10 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
28a20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
28a30 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
28a40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28a50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28a60 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
28a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
28a80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28a90 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
28aa0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
28ab0 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
28ac0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
28ad0 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
28ae0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
28af0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
28b00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
28b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
28b20 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
28b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28b40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
28b50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
28b60 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
28b70 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
28b80 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
28b90 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
28ba0 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
28bb0 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
28bc0 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
28bd0 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
28be0 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
28bf0 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
28c00 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
28c10 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
28c20 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
28c30 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
28c40 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
28c50 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
28c60 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
28c70 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
28c80 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
28c90 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
28ca0 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
28cb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
28cc0 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
28cd0 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b  er->noSync==0 );
28ce0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
28cf0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65   ii<nPage && nee
28d00 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  dSync; ii++){.  
28d10 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
28d20 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
28d30 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
28d40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
28d50 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
28d60 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c    pPage->flags |
28d70 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
28d80 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  C;.          sql
28d90 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
28da0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
28db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
28dc0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
28dd0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a  edSync);.    }..
28de0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
28df0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31  er->doNotSync==1
28e00 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
28e10 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20  doNotSync = 0;. 
28e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
28e30 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
28e40 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
28e50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28e60 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
28e70 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
28e80 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
28e90 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
28ea0 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
28eb0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
28ec0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
28ed0 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
28ee0 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
28ef0 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
28f00 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
28f10 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
28f20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
28f30 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
28f40 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
28f50 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  urn pPg->flags&P
28f60 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65  GHDR_DIRTY;.}.#e
28f70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
28f80 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
28f90 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
28fa0 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
28fb0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
28fc0 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
28fd0 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
28fe0 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
28ff0 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
29000 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
29010 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
29020 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68  s dirty.  This h
29030 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
29040 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ple, when.** the
29050 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
29060 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f  dded as a leaf o
29070 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
29080 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e  nd so its.** con
29090 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d  tent no longer m
290a0 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atters..**.** Th
290b0 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
290c0 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
290d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
290e0 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
290f0 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
29100 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
29110 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  d. The pager mar
29120 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
29130 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
29140 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
29150 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
29160 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
29170 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
29180 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61  mization can qua
29190 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
291a0 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45   of large .** DE
291b0 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  LETE operations.
291c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
291d0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50  PagerDontWrite(P
291e0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
291f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
29200 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
29210 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
29220 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61  DR_DIRTY) && pPa
29230 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
29240 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  =0 ){.    PAGERT
29250 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54  RACE(("DONT_WRIT
29260 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
29270 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
29280 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
29290 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
292a0 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
292b0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
292c0 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  o)).    pPg->fla
292d0 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54  gs |= PGHDR_DONT
292e0 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53  _WRITE;.#ifdef S
292f0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
29300 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
29310 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
29320 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
29330 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  f.  }.}../*.** T
29340 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
29350 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
29360 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
29370 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29380 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75  e .** change-cou
29390 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  nter, stored as 
293a0 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 4-byte big-end
293b0 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72  ian integer star
293c0 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65  ting at .** byte
293d0 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
293e0 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a  e pager file..**
293f0 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72  .** If the isDir
29400 65 63 74 20 66 6c 61 67 20 69 73 20 7a 65 72 6f  ect flag is zero
29410 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64  , then this is d
29420 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a  one by calling .
29430 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ** sqlite3PagerW
29440 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31  rite() on page 1
29450 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  , then modifying
29460 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
29470 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
29480 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
29490 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  the file will be
294a0 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68   updated when th
294b0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61  e current.** tra
294c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
294d0 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
294e0 20 69 73 44 69 72 65 63 74 20 66 6c 61 67 20 6d   isDirect flag m
294f0 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
29500 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
29510 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
29520 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
29530 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
29540 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
29550 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
29560 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
29570 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
29580 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
29590 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
295a0 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
295b0 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
295c0 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
295d0 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
295e0 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
295f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
29600 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
29610 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
29620 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
29630 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
29640 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
29650 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
29660 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65  ITE_OK;..  /* De
29670 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61  clare and initia
29680 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e  lize constant in
29690 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27  teger 'isDirect'
296a0 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74  . If the.  ** at
296b0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
296c0 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
296d0 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
296e0 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a  , then isDirect.
296f0 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
29700 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
29710 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69   passed as the i
29720 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61  sDirectMode para
29730 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  meter.  ** to th
29740 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
29750 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c  erwise, it is al
29760 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
29770 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
29780 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20  idea is that if 
29790 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
297a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
297b0 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65   not.  ** enable
297c0 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
297d0 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  e, the compiler 
297e0 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73  can omit the tes
297f0 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69  ts of.  ** 'isDi
29800 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20  rect' below, as 
29810 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63  well as the bloc
29820 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68  k enclosed in th
29830 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69  e.  ** "if( isDi
29840 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f  rect )" conditio
29850 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
29860 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
29870 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 63 6f 6e  OMIC_WRITE.  con
29880 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20  st int isDirect 
29890 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
298a0 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29  sDirectMode==0 )
298b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
298c0 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64  ETER(isDirectMod
298d0 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73  e);.#else.  cons
298e0 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d  t int isDirect =
298f0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3b 0a 23   isDirectMode;.#
29900 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
29910 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
29920 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
29930 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
29940 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
29950 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
29960 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64  ze>0 ){.    PgHd
29970 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20  r *pPgHdr;      
29980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
29990 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
299a0 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e   */.    u32 chan
299b0 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20  ge_counter;     
299c0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
299d0 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65   value of change
299e0 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a  -counter field *
299f0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
29a00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
29a10 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
29a20 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f  r->fd) );..    /
29a30 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
29a40 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
29a50 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
29a60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
29a70 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
29a80 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65  PgHdr);.    asse
29a90 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c  rt( pPgHdr==0 ||
29aa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29ab0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67  ;..    /* If pag
29ac0 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65  e one was fetche
29ad0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
29ae0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
29af0 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  n is not.    ** 
29b00 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72  operating in dir
29b10 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70  ect-mode, make p
29b20 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 0a  age 1 writable..
29b30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
29b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29b50 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20  !isDirect ){.   
29b60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29b70 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
29b80 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
29b90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29ba0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72  ){.      /* Incr
29bb0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
29bc0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
29bd0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
29be0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20  yte 24. */.     
29bf0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
29c00 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
29c10 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
29c20 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
29c30 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
29c40 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  ++;.      put32b
29c50 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
29c60 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
29c70 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
29c80 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e  .      /* If run
29c90 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d  ning in direct m
29ca0 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63  ode, write the c
29cb0 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
29cc0 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a  1 to the file. *
29cd0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69  /.      if( isDi
29ce0 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rect ){.        
29cf0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
29d00 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61   = pPgHdr->pData
29d10 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
29d20 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
29d30 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
29d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29d50 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
29d60 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
29d70 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  pageSize, 0);.  
29d80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
29d90 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  If everything wo
29da0 72 6b 65 64 2c 20 73 65 74 20 74 68 65 20 63 68  rked, set the ch
29db0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
29dc0 61 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ag. */.      if(
29dd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29de0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
29df0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
29e00 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
29e10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
29e20 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
29e30 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
29e40 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29e50 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20  f(pPgHdr);.  }. 
29e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29e70 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
29e80 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
29e90 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
29ea0 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
29eb0 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  files.** or page
29ec0 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
29ed0 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
29ee0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
29ef0 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64  ssful, or called
29f00 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20   on a pager for 
29f10 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f  which it is a no
29f20 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  -op, this.** fun
29f30 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
29f40 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
29f50 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  se, an IO error 
29f60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
29f70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29f80 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
29f90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
29fa0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
29fd0 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  */.  if( MEMDB |
29fe0 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
29ff0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2a000 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2a010 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a020 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
2a030 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
2a040 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72  _flags);.  }.  r
2a050 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a060 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
2a070 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
2a080 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
2a090 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
2a0a0 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
2a0b0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2a0c0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
2a0d0 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
2a0e0 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
2a0f0 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
2a100 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
2a110 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
2a120 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
2a130 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
2a140 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
2a150 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
2a160 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
2a170 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
2a180 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
2a190 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2a1a0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
2a1b0 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  r is updated,.**
2a1c0 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c     * the journal
2a1d0 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65   is synced (unle
2a1e0 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ss the atomic-wr
2a1f0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2a200 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20   is used),.**   
2a210 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  * all dirty page
2a220 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
2a230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a240 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20  le, .**   * the 
2a250 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2a260 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72   truncated (if r
2a270 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a  equired), and.**
2a280 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2a290 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a  e file synced. .
2a2a0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  **.** The only t
2a2b0 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e  hing that remain
2a2c0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
2a2d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
2a2e0 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28  o finalize .** (
2a2f0 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
2a300 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72   or zero the fir
2a310 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20  st part of) the 
2a320 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
2a330 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
2a340 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2a350 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
2a360 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
2a370 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
2a380 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
2a390 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
2a3a0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
2a3b0 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
2a3c0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2a3d0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
2a3e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
2a3f0 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
2a400 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
2a410 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2a420 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
2a430 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
2a440 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
2a450 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
2a460 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
2a470 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
2a480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a490 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
2a4a0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
2a4b0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
2a4c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2a4d0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
2a4e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
2a4f0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
2a500 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2a530 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2a540 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20   *zMaster,      
2a550 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
2a560 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72  NULL, the master
2a570 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
2a580 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20  .  int noSync   
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
2a5b0 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20  it the xSync on 
2a5c0 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29  the db file */.)
2a5d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a5e0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2a5f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a600 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  de */..  if( pPa
2a610 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
2a620 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
2a630 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
2a640 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2a650 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
2a660 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
2a670 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a  s nSize=%d\n", .
2a680 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
2a690 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
2a6a0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
2a6b0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ));..  /* If thi
2a6c0 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
2a6d0 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
2a6e0 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
2a6f0 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
2a700 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
2a710 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2a720 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
2a730 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
2a740 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72   MEMDB && pPager
2a750 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
2a760 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
2a770 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
2a780 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c  >pBackup);.  }el
2a790 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
2a7a0 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
2a7b0 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ED && pPager->db
2a7c0 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20  Modified ){..   
2a7d0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
2a7e0 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20  g block updates 
2a7f0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2a800 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  er. Exactly how 
2a810 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74  it.    ** does t
2a820 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  his depends on w
2a830 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
2a840 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
2a850 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
2a860 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20   ** was enabled 
2a870 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2a880 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61   and if this tra
2a890 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74  nsaction meets t
2a8a0 68 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69  he .    ** runti
2a8b0 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75  me criteria to u
2a8c0 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  se the operation
2a8d0 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  : .    **.    **
2a8e0 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73      * The file-s
2a8f0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74  ystem supports t
2a900 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2a910 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20  property for.   
2a920 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20   **      blocks 
2a930 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a  of size page-siz
2a940 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20  e, and .    **  
2a950 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    * This commit 
2a960 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
2a970 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
2a980 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
2a990 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79   **    * Exactly
2a9a0 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
2a9b0 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
2a9c0 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
2a9d0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
2a9e0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
2a9f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73  optimization was
2aa00 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20   not enabled at 
2aa10 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
2aa20 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  en the.    ** pa
2aa30 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2aa40 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f  ounter() functio
2aa50 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75  n is called to u
2aa60 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2aa70 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20  .    ** counter 
2aa80 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64  in 'indirect-mod
2aa90 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d  e'. If the optim
2aaa0 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69  ization is compi
2aab0 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a  led in but.    *
2aac0 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61  * is not applica
2aad0 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e  ble to this tran
2aae0 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71  saction, call sq
2aaf0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
2ab00 74 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  te().    ** to m
2ab10 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75  ake sure the jou
2ab20 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63  rnal file has ac
2ab30 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61  tually been crea
2ab40 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20  ted, then call. 
2ab50 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
2ab60 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
2ab70 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
2ab80 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e  hange-counter in
2ab90 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a   indirect.    **
2aba0 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20   mode. .    **. 
2abb0 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
2abc0 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   if the optimiza
2abd0 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61  tion is both ena
2abe0 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61  bled and applica
2abf0 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ble,.    ** then
2ac00 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72   call pager_incr
2ac10 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
2ac20 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
2ac30 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20  hange-counter.  
2ac40 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27    ** in 'direct'
2ac50 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63   mode. In this c
2ac60 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
2ac70 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  file will never 
2ac80 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
2ac90 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73  d for this trans
2aca0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23  action..    */.#
2acb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2acc0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2acd0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
2ace0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2acf0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2ad00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
2ad10 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2ad20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2ad30 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
2ad40 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  er && isOpen(pPa
2ad50 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  ger->jfd) .     
2ad60 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
2ad70 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65  alOff==jrnlBuffe
2ad80 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20  rSize(pPager) . 
2ad90 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64      && pPager->d
2ada0 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64  bSize>=pPager->d
2adb0 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26  bFileSize.     &
2adc0 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c  & (0==(pPg = sql
2add0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
2ade0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
2adf0 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d  che)) || 0==pPg-
2ae00 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a  >pDirty).    ){.
2ae10 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
2ae20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e  the db file chan
2ae30 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74  ge counter via t
2ae40 68 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20  he direct-write 
2ae50 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20  method. The .   
2ae60 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
2ae70 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
2ae80 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
2ae90 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2aea0 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a   page 1 .      *
2aeb0 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  * to include the
2aec0 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20   updated change 
2aed0 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
2aee0 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20   write page 1 . 
2aef0 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
2af00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2af10 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
2af20 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
2af30 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  te .      ** pro
2af40 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73  perty of the hos
2af50 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  t file-system, t
2af60 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20  his is safe..   
2af70 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2af80 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2af90 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
2afa0 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
2afb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2afc0 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
2afd0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
2afe0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2aff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b000 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2b010 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2b020 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2b030 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a    }.    }.#else.
2b040 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
2b050 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2b060 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65  r(pPager, 0);.#e
2b070 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21  ndif.    if( rc!
2b080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2b090 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2b0a0 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  ne_exit;..    /*
2b0b0 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
2b0c0 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
2b0d0 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
2b0e0 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
2b0f0 65 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  es.    ** being 
2b100 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
2b110 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
2b120 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
2b130 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
2b140 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e  * file. This can
2b150 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20   only happen in 
2b160 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
2b170 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b180 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74  Before reading t
2b190 68 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61  he pages with pa
2b1a0 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65  ge numbers large
2b1b0 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20  r than the .    
2b1c0 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ** current value
2b1d0 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
2b1e0 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61 63  , set dbSize bac
2b1f0 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20  k to the value. 
2b200 20 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f     ** that it to
2b210 6f 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ok at the start 
2b220 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
2b230 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  on. Otherwise, t
2b240 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  he.    ** calls 
2b250 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
2b260 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f  et() return zero
2b270 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64  ed pages instead
2b280 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64   of .    ** read
2b290 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ing data from th
2b2a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b2b0 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
2b2c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2b2d0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2b2e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
2b2f0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2b300 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2b310 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2b320 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b330 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  OFF .    ){.    
2b340 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20    Pgno i;       
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b370 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2b380 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
2b390 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47  Pgno iSkip = PAG
2b3a0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2b3b0 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c  r); /* Pending l
2b3c0 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ock page */.    
2b3d0 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53    const Pgno dbS
2b3e0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2b3f0 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44  Size;       /* D
2b400 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69  atabase image si
2b410 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61  ze */ .      pPa
2b420 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
2b430 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2b440 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64  ;.      for( i=d
2b450 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67  bSize+1; i<=pPag
2b460 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20  er->dbOrigSize; 
2b470 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i++ ){.        i
2b480 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
2b490 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
2b4a0 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
2b4b0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
2b4c0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2b4d0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2b4e0 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e  /* Page to journ
2b4f0 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  al */.          
2b500 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b510 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
2b520 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
2b530 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b540 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2b550 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2b560 74 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  t;.          rc 
2b570 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b580 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
2b590 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2b5a0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
2b5b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2b5c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2b5d0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2b5e0 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
2b5f0 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20    }.      } .   
2b600 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2b610 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20  e = dbSize;.    
2b620 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2b630 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
2b640 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
2b650 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
2b660 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65  file. If a maste
2b670 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  r .    ** journa
2b680 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
2b690 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
2b6a0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
2b6b0 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a  nal file, .    *
2b6c0 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20  * or if zMaster 
2b6d0 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74  is NULL (no mast
2b6e0 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65  er journal), the
2b6f0 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  n this call is a
2b700 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
2b710 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
2b720 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
2b730 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
2b740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b750 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2b760 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2b770 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
2b780 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2b790 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  If the atomic-up
2b7a0 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
2b7b0 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a  n is being.    *
2b7c0 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c  * used, this cal
2b7d0 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74  l will not creat
2b7e0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2b7f0 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e  le or perform an
2b800 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f  y.    ** real IO
2b810 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2b820 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
2b830 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
2b840 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2b850 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2b860 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20  _one_exit;..    
2b870 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
2b880 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
2b890 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2b8a0 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
2b8b0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2b8c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2b8d0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2b8e0 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66  PCache));.    if
2b8f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b900 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2b910 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
2b920 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  R_BLOCKED );.   
2b930 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70     goto commit_p
2b940 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2b950 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2b960 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
2b970 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2b980 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2b990 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
2b9a0 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a  not the same siz
2b9b0 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  e as the databas
2b9c0 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20  e image,.    ** 
2b9d0 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74  then use pager_t
2b9e0 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20  runcate to grow 
2b9f0 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69  or shrink the fi
2ba00 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  le here..    */.
2ba10 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2ba20 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  dbSize!=pPager->
2ba30 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
2ba40 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20      Pgno nNew = 
2ba50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d  pPager->dbSize -
2ba60 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
2ba70 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
2ba80 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
2ba90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2baa0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
2bab0 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20  LUSIVE );.      
2bac0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
2bad0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77  ate(pPager, nNew
2bae0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2baf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2bb00 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2bb10 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  ne_exit;.    }..
2bb20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
2bb30 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
2bb40 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
2bb50 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
2bb60 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
2bb70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2bb80 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2bb90 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
2bba0 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
2bbb0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
2bbc0 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
2bbd0 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
2bbe0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2bbf0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f  _SYNCED;.  }..co
2bc00 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2bc10 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
2bc20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
2bc30 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
2bc40 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2bc50 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
2bc60 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
2bc70 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
2bc80 2a 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c  ** lock to spill
2bc90 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
2bca0 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
2bcb0 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
2bcc0 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20      ** there is 
2bcd0 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
2bce0 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
2bcf0 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 2a  ent, it is.    *
2bd00 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75  * better to retu
2bd10 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
2bd20 20 20 20 20 2a 2a 2f 0a 20 20 20 20 72 63 20 3d      **/.    rc =
2bd30 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2bd40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2bd50 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  .../*.** When th
2bd60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2bd70 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62  alled, the datab
2bd80 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
2bd90 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20  n completely.** 
2bda0 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
2bdb0 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d  ct the changes m
2bdc0 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65  ade by the curre
2bdd0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  nt transaction a
2bde0 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20  nd.** synced to 
2bdf0 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61  disk. The journa
2be00 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  l file still exi
2be10 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  sts in the file-
2be20 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67  system .** thoug
2be30 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c  h, and if a fail
2be40 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68  ure occurs at th
2be50 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c  is point it will
2be60 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62   eventually.** b
2be70 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d  e used as a hot-
2be80 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
2be90 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
2bea0 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ion rolled back.
2beb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2bec0 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74  tion finalizes t
2bed0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2bee0 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74   either by delet
2bef0 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74  ing, .** truncat
2bf00 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79  ing or partially
2bf10 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20   zeroing it, so 
2bf20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62  that it cannot b
2bf30 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68  e used .** for h
2bf40 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2bf50 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69  ack. Once this i
2bf60 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73  s done the trans
2bf70 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72  action is.** irr
2bf80 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74  evocably committ
2bf90 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2bfa0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
2bfb0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2bfc0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2bfd0 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65  he pager.** move
2bfe0 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  s into the error
2bff0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
2c000 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
2c010 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
2c020 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
2c030 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
2c040 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2c050 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c070 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2c080 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  e */..  /* Do no
2c090 74 20 70 72 6f 63 65 65 64 20 69 66 20 74 68 65  t proceed if the
2c0a0 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64   pager is alread
2c0b0 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
2c0c0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tate. */.  if( p
2c0d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
2c0e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
2c0f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2c100 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  }..  /* This fun
2c110 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
2c120 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68   be called if th
2c130 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
2c140 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20  n at least.  ** 
2c150 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
2c160 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65 64  tate. And indeed
2c170 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64 6f   SQLite never do
2c180 65 73 20 74 68 69 73 2e 20 42 75 74 20 69 74 20  es this. But it 
2c190 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20  is.  ** nice to 
2c1a0 68 61 76 65 20 74 68 69 73 20 64 65 66 65 6e 73  have this defens
2c1b0 69 76 65 20 62 6c 6f 63 6b 20 68 65 72 65 20 61  ive block here a
2c1c0 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyway..  */.  if
2c1d0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2c1e0 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
2c1f0 52 56 45 44 29 20 29 7b 0a 20 20 20 20 72 65 74  RVED) ){.    ret
2c200 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2c210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 6f  ;.  }..  /* An o
2c220 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20  ptimization. If 
2c230 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
2c240 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
2c250 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20  dified during.  
2c260 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ** this transact
2c270 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69  ion, the pager i
2c280 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
2c290 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20  lusive-mode and 
2c2a0 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65  is.  ** using pe
2c2b0 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
2c2c0 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  s, then this fun
2c2d0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2c2e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2c2f0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2c300 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
2c310 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  tly contains a s
2c320 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  ingle journal . 
2c330 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20   ** header with 
2c340 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73  the nRec field s
2c350 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68  et to 0. If such
2c360 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73   a journal is us
2c370 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74  ed as.  ** a hot
2c380 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20  -journal during 
2c390 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
2c3a0 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20  back, 0 changes 
2c3b0 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a  will be made.  *
2c3c0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
2c3d0 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65  e file. So there
2c3e0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a   is no need to z
2c3f0 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ero the journal 
2c400 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69  .  ** header. Si
2c410 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
2c420 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2c430 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  de, there is no 
2c440 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f  need.  ** to dro
2c450 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68  p any locks eith
2c460 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
2c470 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2c480 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  d==0 && pPager->
2c490 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
2c4a0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
2c4b0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2c4c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
2c4d0 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  IST.  ){.    ass
2c4e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
2c4f0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
2c500 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
2c510 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2c520 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2c530 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d  PAGERTRACE(("COM
2c540 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
2c550 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
2c560 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2c570 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
2c580 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  CED || MEMDB || 
2c590 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2c5a0 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  ied );.  rc = pa
2c5b0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2c5c0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
2c5d0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
2c5e0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
2c5f0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2c600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
2c610 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
2c620 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
2c630 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
2c640 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
2c650 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2c660 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20  on performs two 
2c670 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tasks:.**.**   1
2c680 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20  ) It rolls back 
2c690 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2c6a0 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20  , restoring all 
2c6b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
2c6c0 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65  d .**      in-me
2c6d0 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
2c6e0 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68   to the state th
2c6f0 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20  ey were in when 
2c700 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
2c710 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e  **      was open
2c720 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20  ed, and.**   2) 
2c730 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65  It finalizes the
2c740 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73   journal file, s
2c750 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  o that it is not
2c760 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a   used for hot.**
2c770 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61        rollback a
2c780 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74  t any point in t
2c790 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  he future..**.**
2c7a0 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
2c7b0 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66  following qualif
2c7c0 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  ications:.**.** 
2c7d0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
2c7e0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74   file is not yet
2c7f0 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
2c800 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2c810 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e  ed,.**   then on
2c820 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72  ly (2) is perfor
2c830 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  med. In this cas
2c840 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f  e there is no jo
2c850 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
2c860 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a  to roll back..**
2c870 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65  .** * If in an e
2c880 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
2c890 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
2c8a0 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29  L, then task (1)
2c8b0 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72   is .**   perfor
2c8c0 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66  med. If successf
2c8d0 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65  ul, task (2). Re
2c8e0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
2c8f0 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20  outcome.**   of 
2c900 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f  either, the erro
2c910 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
2c920 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
2c930 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20  o the caller.** 
2c940 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53    (i.e. either S
2c950 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
2c960 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
2c970 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70  **.** * If the p
2c980 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52  ager is in PAGER
2c990 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c  _RESERVED state,
2c9a0 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31   then attempt (1
2c9b0 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20  ). Whether.**   
2c9c0 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75  or not (1) is su
2c9d0 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61  ccussful, also a
2c9e0 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73  ttempt (2). If s
2c9f0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
2ca00 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b  n.**   SQLITE_OK
2ca10 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74  . Otherwise, ent
2ca20 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2ca30 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
2ca40 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72  e first .**   er
2ca50 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74  ror code encount
2ca60 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  ered. .**.**   I
2ca70 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
2ca80 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
2ca90 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2caa0 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e   was written to.
2cab0 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66   .**   So is saf
2cac0 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  e to finalize th
2cad0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2cae0 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62  ven if the playb
2caf0 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61  ack .**   (opera
2cb00 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20  tion 1) failed. 
2cb10 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65  However the page
2cb20 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65  r must enter the
2cb30 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20   error state.** 
2cb40 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74    as the content
2cb50 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  s of the in-memo
2cb60 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77  ry cache are now
2cb70 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   suspect..**.** 
2cb80 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e  * Finally, if in
2cb90 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
2cba0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74   state, then att
2cbb0 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a  empt (1). Only.*
2cbc0 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20  *   attempt (2) 
2cbd0 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73  if (1) is succes
2cbe0 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c  sful. Return SQL
2cbf0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
2cc00 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72  sful,.**   other
2cc10 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65  wise enter the e
2cc20 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
2cc30 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
2cc40 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  code from the .*
2cc50 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72  *   failing oper
2cc60 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  ation..**.**   I
2cc70 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2cc80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
2cc90 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  y have been writ
2cca0 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68  ten to. So if th
2ccb0 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20  e.**   playback 
2ccc0 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f  operation did no
2ccd0 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75  t succeed it wou
2cce0 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
2ccf0 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20  o finalize.**   
2cd00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cd10 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65  . It needs to be
2cd20 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
2cd30 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74  e-system so that
2cd40 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72  .**   some other
2cd50 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65   process can use
2cd60 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74   it to restore t
2cd70 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74  he database stat
2cd80 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a  e (by.**   hot-j
2cd90 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
2cda0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cdb0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
2cdc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2cdd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2cde0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2cdf0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2ce00 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52  ode */.  PAGERTR
2ce10 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE(("ROLLBACK %
2ce20 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2ce30 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21  ager)));.  if( !
2ce40 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2ce50 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  ed || !isOpen(pP
2ce60 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2ce70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
2ce80 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2ce90 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2cea0 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65  Master);.  }else
2ceb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2cec0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
2ced0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2cee0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
2cef0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2cf00 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
2cf10 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
2cf20 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
2cf30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
2cf40 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2cf50 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
2cf60 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2cf70 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
2cf80 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
2cf90 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  c2;.      rc = p
2cfa0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
2cfb0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
2cfc0 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
2cfd0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2cfe0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2cff0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
2d000 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d010 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2d020 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
2d030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2d040 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
2d050 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
2d060 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45    }..    if( !ME
2d070 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
2d080 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
2d090 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2d0a0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2d0b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
2d0c0 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
2d0d0 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
2d0e0 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
2d0f0 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
2d100 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
2d110 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
2d120 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
2d130 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65  .    ** persiste
2d140 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
2d150 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
2d160 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d  pPager, rc);.  }
2d170 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d180 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2d190 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
2d1a0 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
2d1b0 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
2d1c0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
2d1d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2d1e0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
2d1f0 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c  table..*/.u8 sql
2d200 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
2d210 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
2d220 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2d230 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
2d240 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2d250 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
2d260 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2d270 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
2d280 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
2d290 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
2d2a0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2d2b0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2d2c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2d2d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2d2e0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2d2f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2d300 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
2d310 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2d320 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
2d330 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65  nt(DbPage *pPage
2d340 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2d350 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
2d360 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a  count(pPage);.}.
2d370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2d380 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
2d390 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2d3a0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
2d3b0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
2d3c0 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
2d3d0 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
2d3e0 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
2d3f0 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
2d400 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  0] = sqlite3Pcac
2d410 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2d420 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2d430 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [1] = sqlite3Pca
2d440 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
2d450 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2d460 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[2] = sqlite3P
2d470 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a  cacheGetCachesiz
2d480 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
2d490 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  e);.  a[3] = pPa
2d4a0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
2d4b0 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d   ? (int) pPager-
2d4c0 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20  >dbSize : -1;.  
2d4d0 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
2d4e0 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
2d4f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2d500 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
2d510 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
2d520 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
2d530 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55   a[8] = 0;  /* U
2d540 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72  sed to be pPager
2d550 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39  ->nOvfl */.  a[9
2d560 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
2d570 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
2d580 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
2d590 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69  eturn a;.}.#endi
2d5a0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
2d5b0 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
2d5c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
2d5d0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2d5e0 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50  e3PagerIsMemdb(P
2d5f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2d600 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d   return MEMDB;.}
2d610 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
2d620 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20  at there are at 
2d630 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74  least nSavepoint
2d640 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e   savepoints open
2d650 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a  . If there are.*
2d660 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73  * currently less
2d670 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74   than nSavepoint
2d680 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65  s open, then ope
2d690 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  n one or more sa
2d6a0 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d  vepoints.** to m
2d6b0 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65  ake up the diffe
2d6c0 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75  rence. If the nu
2d6d0 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
2d6e0 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ts is already.**
2d6f0 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70   equal to nSavep
2d700 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  oint, then this 
2d710 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2d720 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  -op..**.** If a 
2d730 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2d740 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  n fails, SQLITE_
2d750 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
2d760 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a  d. If an error .
2d770 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
2d780 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d  opening the sub-
2d790 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2d7a0 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  en an IO error c
2d7b0 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ode is.** return
2d7c0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  ed. Otherwise, S
2d7d0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
2d7e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2d7f0 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  nSavepoint(Pager
2d800 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53   *pPager, int nS
2d810 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
2d820 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d840 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2d850 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
2d860 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72  Current = pPager
2d870 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  ->nSavepoint;   
2d880 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2d890 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
2d8a0 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  ints */..  if( n
2d8b0 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65  Savepoint>nCurre
2d8c0 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  nt && pPager->us
2d8d0 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2d8e0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2d910 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
2d920 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
2d930 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20  nt *aNew;       
2d940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d950 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ew Pager.aSavepo
2d960 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20  int array */..  
2d970 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72    /* Either ther
2d980 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a  e is no active j
2d990 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75  ournal or the su
2d9a0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  b-journal is ope
2d9b0 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65  n or .    ** the
2d9c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61   journal is alwa
2d9d0 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  ys stored in mem
2d9e0 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ory */.    asser
2d9f0 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
2da00 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70  point==0 || isOp
2da10 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2da20 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
2da30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2da40 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2da50 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
2da60 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68  ..    /* Grow th
2da70 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
2da80 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72  nt array using r
2da90 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e  ealloc(). Return
2daa0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
2dab0 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f    ** if the allo
2dac0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74  cation fails. Ot
2dad0 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68  herwise, zero th
2dae0 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e  e new portion in
2daf0 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20   case a .    ** 
2db00 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
2db10 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75  ccurs while popu
2db20 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65  lating it in the
2db30 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62   for(...) loop b
2db40 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
2db50 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61   aNew = (PagerSa
2db60 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65  vepoint *)sqlite
2db70 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
2db80 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
2db90 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67  oint, sizeof(Pag
2dba0 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61  erSavepoint)*nSa
2dbb0 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20  vepoint.    );. 
2dbc0 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a     if( !aNew ){.
2dbd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2dbe0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2dbf0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65  .    memset(&aNe
2dc00 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20  w[nCurrent], 0, 
2dc10 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72  (nSavepoint-nCur
2dc20 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50  rent) * sizeof(P
2dc30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b  agerSavepoint));
2dc40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61  .    pPager->aSa
2dc50 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a  vepoint = aNew;.
2dc60 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
2dc70 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f  epoint = nSavepo
2dc80 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70  int;..    /* Pop
2dc90 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53  ulate the PagerS
2dca0 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
2dcb0 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74  res just allocat
2dcc0 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ed. */.    for(i
2dcd0 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e  i=nCurrent; ii<n
2dce0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
2dcf0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2dd00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
2dd10 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65  lid );.      aNe
2dd20 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50  w[ii].nOrig = pP
2dd30 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2dd40 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
2dd50 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
2dd60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2dd70 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  f>0 ){.        a
2dd80 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20  New[ii].iOffset 
2dd90 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2dda0 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lOff;.      }els
2ddb0 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  e{.        aNew[
2ddc0 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f  ii].iOffset = JO
2ddd0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
2dde0 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
2ddf0 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75      aNew[ii].iSu
2de00 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  bRec = pPager->n
2de10 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e  SubRec;.      aN
2de20 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
2de30 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  int = sqlite3Bit
2de40 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
2de50 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20  ->dbSize);.     
2de60 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70   if( !aNew[ii].p
2de70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  InSavepoint ){. 
2de80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2de90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2dea0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2deb0 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
2dec0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
2ded0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
2dee0 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ned. */.    rc =
2def0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2df00 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
2df10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2df20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2df30 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
2df40 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
2df50 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61  se (commit) a sa
2df60 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20  vepoint..** The 
2df70 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c  savepoint to rel
2df80 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
2df90 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65   need not be the
2dfa0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a   most recently .
2dfb0 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70  ** created savep
2dfc0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  oint..**.** Para
2dfd0 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61  meter op is alwa
2dfe0 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  ys either SAVEPO
2dff0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20  INT_ROLLBACK or 
2e000 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2e010 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53  E..** If it is S
2e020 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2e030 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61  , then release a
2e040 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73  nd destroy the s
2e050 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a  avepoint with.**
2e060 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e   index iSavepoin
2e070 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  t. If it is SAVE
2e080 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
2e090 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c  then rollback al
2e0a0 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61  l changes.** tha
2e0b0 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  t have occurred 
2e0c0 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66  since the specif
2e0d0 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61  ied savepoint wa
2e0e0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
2e0f0 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74   The savepoint t
2e100 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
2e110 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66  lease is identif
2e120 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
2e130 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e   .** iSavepoint.
2e140 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65   A value of 0 me
2e150 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ans to operate o
2e160 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  n the outermost 
2e170 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68  savepoint.** (th
2e180 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29  e first created)
2e190 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61  . A value of (Pa
2e1a0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
2e1b0 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a  ) means operate.
2e1c0 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** on the most r
2e1d0 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
2e1e0 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53  savepoint. If iS
2e1f0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
2e200 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67  ter than.** (Pag
2e210 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2e220 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2e230 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2e240 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61  .**.** If a nega
2e250 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61  tive value is pa
2e260 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2e270 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ction, then the 
2e280 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2e290 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
2e2a0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
2e2b0 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c  ifferent to call
2e2c0 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
2e2d0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62  agerRollback() b
2e2e0 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
2e2f0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65  tion does not te
2e300 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74  rminate.** the t
2e310 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e  ransaction or un
2e320 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
2e330 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f  e, it just resto
2e340 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  res the .** cont
2e350 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
2e360 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
2e370 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  inal state. .**.
2e380 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20  ** In any case, 
2e390 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
2e3a0 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
2e3b0 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
2e3c0 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
2e3d0 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20  troyed. If this 
2e3e0 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65  is a release ope
2e3f0 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45  ration (op==SAVE
2e400 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a  POINT_RELEASE),.
2e410 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e  ** then savepoin
2e420 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  t iSavepoint is 
2e430 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a  also destroyed..
2e440 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2e450 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2e460 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2e470 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2e480 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20  on fails,.** or 
2e490 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2e4a0 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
2e4b0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c  occurs while rol
2e4c0 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20  ling back a .** 
2e4d0 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f  savepoint. If no
2e4e0 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53   errors occur, S
2e4f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2e500 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  rned..*/ .int sq
2e510 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
2e520 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
2e530 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
2e540 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2e550 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e560 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
2e570 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
2e580 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
2e590 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
2e5a0 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
2e5b0 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53  oint>=0 || op==S
2e5c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2e5d0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
2e5e0 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
2e5f0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
2e600 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2e610 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2e620 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
2e630 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
2e640 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e650 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f  remaining savepo
2e660 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20  ints after this 
2e670 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  op. */..    /* F
2e680 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
2e690 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ny savepoints wi
2e6a0 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69  ll still be acti
2e6b0 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20  ve after this.  
2e6c0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
2e6d0 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65  Store this value
2e6e0 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66   in nNew. Then f
2e6f0 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73  ree resources as
2e700 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a  sociated .    **
2e710 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f   with any savepo
2e720 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65  ints that are de
2e730 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20  stroyed by this 
2e740 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
2e750 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61  /.    nNew = iSa
2e760 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53  vepoint + (op==S
2e770 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2e780 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e  K);.    for(ii=n
2e790 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  New; ii<pPager->
2e7a0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2e7b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e7c0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
2e7d0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2e7e0 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2e7f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
2e800 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2e810 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = nNew;..    /*
2e820 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f   If this is a ro
2e830 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
2e840 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73  , playback the s
2e850 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69  pecified savepoi
2e860 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  nt..    ** If th
2e870 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  is is a temp-fil
2e880 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  e, it is possibl
2e890 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
2e8a0 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20  al file has.    
2e8b0 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
2e8c0 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
2e8d0 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20  case there have 
2e8e0 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
2e8f0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
2e900 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20  tabase file, so 
2e910 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  the playback ope
2e920 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b  ration can be sk
2e930 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ipped..    */.  
2e940 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
2e950 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20  INT_ROLLBACK && 
2e960 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2e970 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  fd) ){.      Pag
2e980 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
2e990 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d  vepoint = (nNew=
2e9a0 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61  =0)?0:&pPager->a
2e9b0 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31  Savepoint[nNew-1
2e9c0 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ];.      rc = pa
2e9d0 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
2e9e0 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61  oint(pPager, pSa
2e9f0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
2ea00 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54  assert(rc!=SQLIT
2ea10 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20  E_DONE);.    }. 
2ea20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
2ea30 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66   is a release of
2ea40 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2ea50 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61  avepoint, trunca
2ea60 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  te .    ** the s
2ea70 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65  ub-journal to ze
2ea80 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
2ea90 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65  . */.    if( nNe
2eaa0 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45  w==0 && op==SAVE
2eab0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26  POINT_RELEASE &&
2eac0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ead0 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  sjfd) ){.      a
2eae0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2eaf0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63  E_OK );.      rc
2eb00 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
2eb10 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  cate(pPager->sjf
2eb20 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  d, 0);.      pPa
2eb30 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
2eb40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2eb50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2eb60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2eb70 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2eb80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2eb90 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2eba0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
2ebb0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
2ebc0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2ebd0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
2ebe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2ebf0 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
2ec00 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
2ec10 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
2ec20 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
2ec30 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
2ec40 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2ec50 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
2ec60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2ec70 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
2ec80 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2ec90 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
2eca0 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
2ecb0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
2ecc0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
2ecd0 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
2ece0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2ecf0 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
2ed00 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
2ed10 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
2ed20 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2ed30 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
2ed40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
2ed50 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
2ed60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2ed70 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2ed80 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
2ed90 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
2eda0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2edb0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2edc0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
2edd0 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
2ede0 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
2edf0 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
2ee00 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
2ee10 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
2ee20 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
2ee30 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
2ee40 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
2ee50 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
2ee60 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2ee70 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
2ee80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
2ee90 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65  S_CODEC./*.** Se
2eea0 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
2eeb0 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
2eec0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
2eed0 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
2eee0 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
2eef0 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
2ef00 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
2ef10 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
2ef20 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
2ef30 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
2ef40 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
2ef50 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
2ef60 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  rg;.}.#endif..#i
2ef70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ef80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
2ef90 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
2efa0 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e   pPg to location
2efb0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
2efc0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  e..**.** There m
2efd0 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
2efe0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2eff0 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
2f000 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28  ted at.** pgno (
2f010 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50  which we call pP
2f020 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61  gOld) though tha
2f030 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65  t page is allowe
2f040 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61  d to be.** in ca
2f050 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  che.  If the pag
2f060 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
2f070 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
2f080 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
2f090 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
2f0a0 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
2f0b0 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
2f0c0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
2f0d0 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
2f0e0 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
2f0f0 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
2f100 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
2f110 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
2f120 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
2f130 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
2f140 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
2f150 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
2f160 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
2f170 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
2f180 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2f190 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
2f1a0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
2f1b0 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
2f1c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2f1d0 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
2f1e0 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
2f1f0 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
2f200 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
2f210 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
2f220 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
2f230 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
2f240 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
2f250 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
2f260 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
2f270 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
2f280 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2f290 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  active)..**.** I
2f2a0 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  f the fourth arg
2f2b0 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c  ument, isCommit,
2f2c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2f2d0 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
2f2e0 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61  being.** moved a
2f2f0 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61  s part of a data
2f300 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74  base reorganizat
2f310 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ion just before 
2f320 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2f330 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  .** is being com
2f340 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20  mitted. In this 
2f350 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72  case, it is guar
2f360 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
2f370 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a  database page .*
2f380 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20  * pPg refers to 
2f390 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
2f3a0 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74  ten to again wit
2f3b0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
2f3c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
2f3d0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2f3e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f3f0 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
2f400 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
2f410 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68  r.** occurs. Oth
2f420 65 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72  erwise, it retur
2f430 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
2f440 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2f450 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
2f460 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
2f470 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pPg, Pgno pgno,
2f480 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a   int isCommit){.
2f490 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
2f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f4b0 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
2f4c0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
2f4d0 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
2f4e0 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Pgno = 0;       
2f4f0 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20  /* Old value of 
2f500 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79  pPg->pgno, if sy
2f510 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a  nc is required *
2f520 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f540 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2f550 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67  */.  Pgno origPg
2f560 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
2f570 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    /* The origina
2f580 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  l page number */
2f590 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2f5a0 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a  >nRef>0 );..  /*
2f5b0 20 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69   If the page bei
2f5c0 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74  ng moved is dirt
2f5d0 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65  y and has not be
2f5e0 65 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20  en saved by the 
2f5f0 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65  latest.  ** save
2f600 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65  point, then save
2f610 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
2f620 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2f630 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a  e into the .  **
2f640 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77   sub-journal now
2f650 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
2f660 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
2f670 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
2f680 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rio:.  **.  **  
2f690 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20   BEGIN;.  **    
2f6a0 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
2f6b0 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74  , then modify it
2f6c0 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a   in memory>.  **
2f6d0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2f6e0 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  ne;.  **       <
2f6f0 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c  Move page X to l
2f700 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20  ocation Y>.  ** 
2f710 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
2f720 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  one;.  **.  ** I
2f730 66 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f  f page X were no
2f740 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
2f750 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72   sub-journal her
2f760 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
2f770 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
2f780 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20   to restore its 
2f790 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68  contents when th
2f7a0 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f  e "ROLLBACK TO o
2f7b0 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ne".  ** stateme
2f7c0 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65  nt were is proce
2f7d0 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ssed..  **.  ** 
2f7e0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29  subjournalPage()
2f7f0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c   may need to all
2f800 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73  ocate space to s
2f810 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69  tore pPg->pgno i
2f820 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20  nto.  ** one or 
2f830 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62  more savepoint b
2f840 69 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20  itvecs. This is 
2f850 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20  the reason this 
2f860 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61  function.  ** ma
2f870 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2f880 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66  NOMEM..  */.  if
2f890 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2f8a0 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20  DR_DIRTY .   && 
2f8b0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2f8c0 28 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49  (pPg).   && SQLI
2f8d0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62  TE_OK!=(rc = sub
2f8e0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2f8f0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2f900 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  n rc;.  }..  PAG
2f910 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  ERTRACE(("MOVE %
2f920 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
2f930 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
2f940 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
2f950 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2f960 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d  pPg->pgno, (pPg-
2f970 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2f980 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e  D_SYNC)?1:0, pgn
2f990 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  o));.  IOTRACE((
2f9a0 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
2f9b0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
2f9c0 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
2f9d0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
2f9e0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
2f9f0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61  nc()ed before pa
2fa00 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e  ge pPg->pgno can
2fa10 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
2fa20 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e   to, store pPg->
2fa30 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61  pgno in local va
2fa40 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50  riable needSyncP
2fa50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gno..  **.  ** I
2fa60 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  f the isCommit f
2fa70 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72  lag is set, ther
2fa80 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
2fa90 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20  remember that.  
2faa0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
2fab0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
2fac0 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
2fad0 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ase page pPg->pg
2fae0 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  no .  ** can be 
2faf0 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
2fb00 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
2fb10 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
2fb20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a  to write to it..
2fb30 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d    */.  if( (pPg-
2fb40 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2fb50 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f  D_SYNC) && !isCo
2fb60 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64  mmit ){.    need
2fb70 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
2fb80 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
2fb90 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
2fba0 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
2fbb0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
2fbc0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
2fbd0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
2fbe0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
2fbf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2fc00 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
2fc10 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
2fc20 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
2fc30 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
2fc40 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
2fc50 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
2fc60 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
2fc70 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
2fc80 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
2fc90 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
2fca0 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
2fcb0 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
2fcc0 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
2fcd0 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
2fce0 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
2fcf0 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
2fd00 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  /.  pPg->flags &
2fd10 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  = ~PGHDR_NEED_SY
2fd20 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70  NC;.  pPgOld = p
2fd30 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
2fd40 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
2fd50 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20  ert( !pPgOld || 
2fd60 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20  pPgOld->nRef==1 
2fd70 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
2fd80 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  ){.    pPg->flag
2fd90 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c  s |= (pPgOld->fl
2fda0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2fdb0 59 4e 43 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69  YNC);.  }..  ori
2fdc0 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  gPgno = pPg->pgn
2fdd0 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  o;.  sqlite3Pcac
2fde0 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f  heMove(pPg, pgno
2fdf0 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
2fe00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2fe10 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29  acheDrop(pPgOld)
2fe20 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2fe30 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
2fe40 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
2fe50 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
2fe60 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
2fe70 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
2fe80 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
2fe90 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2fea0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2feb0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
2fec0 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
2fed0 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
2fee0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
2fef0 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
2ff00 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
2ff10 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
2ff20 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
2ff30 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
2ff40 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
2ff50 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
2ff60 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
2ff70 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
2ff80 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
2ff90 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
2ffa0 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
2ffb0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
2ffc0 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
2ffd0 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
2ffe0 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
2fff0 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
30000 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
30010 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
30020 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
30030 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
30040 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
30050 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
30060 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
30070 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
30080 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
30090 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
300a0 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
300b0 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
300c0 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
300d0 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
300e0 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
300f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
30100 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
30110 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
30120 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
30130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
30140 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
30150 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
30160 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
30170 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
30180 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
30190 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
301a0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
301b0 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
301c0 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
301d0 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
301e0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
301f0 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
30200 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
30210 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
30220 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
30230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30240 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
30250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30260 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
30270 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
30280 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
30290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
302a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
302b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->pInJournal &&
302c0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70   needSyncPgno<=p
302d0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
302e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
302f0 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28  ite3BitvecClear(
30300 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
30310 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  al, needSyncPgno
30320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30330 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30340 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
30350 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
30360 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30370 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45  noSync==0 && !ME
30380 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64  MDB );.    pPgHd
30390 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
303a0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
303b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
303c0 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
303d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
303e0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
303f0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
30400 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
30410 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73  database, make s
30420 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ure the original
30430 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a   page continues.
30440 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69    ** to exist, i
30450 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
30460 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  action needs to 
30470 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 57 65 20 61  roll back.  We a
30480 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65  llocate.  ** the
30490 20 70 61 67 65 20 6e 6f 77 2c 20 69 6e 73 74 65   page now, inste
304a0 61 64 20 6f 66 20 61 74 20 72 6f 6c 6c 62 61 63  ad of at rollbac
304b0 6b 2c 20 62 65 63 61 75 73 65 20 77 65 20 63 61  k, because we ca
304c0 6e 20 62 65 74 74 65 72 20 64 65 61 6c 0a 20 20  n better deal.  
304d0 2a 2a 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f  ** with an out-o
304e0 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6e  f-memory error n
304f0 6f 77 2e 20 20 54 69 63 6b 65 74 20 23 33 37 36  ow.  Ticket #376
30500 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  1..  */.  if( ME
30510 4d 44 42 20 29 7b 0a 20 20 20 20 44 62 50 61 67  MDB ){.    DbPag
30520 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 72 63 20  e *pNew;.    rc 
30530 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
30540 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 6f 72  quire(pPager, or
30550 69 67 50 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 31  igPgno, &pNew, 1
30560 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
30570 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
30580 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  n rc;.    sqlite
30590 33 50 61 67 65 72 55 6e 72 65 66 28 70 4e 65 77  3PagerUnref(pNew
305a0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
305b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
305c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
305d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
305e0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
305f0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
30600 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
30610 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
30620 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73  Page *pPg){.  as
30630 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
30640 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  0 || pPg->pPager
30650 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74  ->memDb );.  ret
30660 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  urn pPg->pData;.
30670 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
30680 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
30690 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
306a0 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73  tes of "extra" s
306b0 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  pace .** allocat
306c0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
306d0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
306e0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
306f0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
30700 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
30710 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
30720 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72  pPg->pPager;.  r
30730 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 70 50  eturn (pPager?pP
30740 67 2d 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a  g->pExtra:0);.}.
30750 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
30760 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
30770 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
30780 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
30790 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f  must be one.** o
307a0 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  f PAGER_LOCKINGM
307b0 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52  ODE_QUERY, PAGER
307c0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
307d0 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52  MAL or .** PAGER
307e0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
307f0 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70  LUSIVE. If the p
30800 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
30810 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
30820 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
30830 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
30840 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
30850 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
30860 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
30870 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  er PAGER_LOCKING
30880 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a  MODE_NORMAL or.*
30890 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
308a0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69  ODE_EXCLUSIVE, i
308b0 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75  ndicating the cu
308c0 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
308d0 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b  updated).** lock
308e0 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ing-mode..*/.int
308f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
30900 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a  kingMode(Pager *
30910 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
30920 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
30930 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
30940 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  NGMODE_QUERY.   
30950 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
30960 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
30970 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  MODE_NORMAL.    
30980 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
30990 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
309a0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
309b0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
309c0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
309d0 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
309e0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
309f0 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26  ODE_NORMAL>=0 &&
30a00 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
30a10 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20  DE_EXCLUSIVE>=0 
30a20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
30a30 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  0 && !pPager->te
30a40 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
30a50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
30a60 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
30a70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
30a80 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  nt)pPager->exclu
30a90 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  siveMode;.}../*.
30aa0 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a  ** Get/set the j
30ab0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20  ournal-mode for 
30ac0 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
30ad0 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
30ae0 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a   be one of:.**.*
30af0 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
30b00 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20  ALMODE_QUERY.** 
30b10 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
30b20 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20  MODE_DELETE.**  
30b30 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
30b40 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20  ODE_TRUNCATE.** 
30b50 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
30b60 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20  MODE_PERSIST.** 
30b70 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
30b80 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50  MODE_OFF.**    P
30b90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
30ba0 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66  _MEMORY.**.** If
30bb0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
30bc0 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
30bd0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  en the journal-m
30be0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
30bf0 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69  e.** value speci
30c00 66 69 65 64 2e 20 20 45 78 63 65 70 74 2c 20 61  fied.  Except, a
30c10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
30c20 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61  base can only ha
30c30 76 65 20 69 74 73 0a 2a 2a 20 6a 6f 75 72 6e 61  ve its.** journa
30c40 6c 20 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f  l mode set to _O
30c50 46 46 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 20 20  FF or _MEMORY.  
30c60 41 74 74 65 6d 70 74 73 20 74 6f 20 63 68 61 6e  Attempts to chan
30c70 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ge the journal.*
30c80 2a 20 6d 6f 64 65 20 6f 66 20 61 6e 20 69 6e 2d  * mode of an in-
30c90 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
30ca0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  to something oth
30cb0 65 72 20 74 68 61 6e 20 5f 4f 46 46 20 6f 72 20  er than _OFF or 
30cc0 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 61 72 65 20 73  _MEMORY.** are s
30cd0 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 64 2e  ilently ignored.
30ce0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
30cf0 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65  ned indicate the
30d00 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
30d10 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72  ly updated) jour
30d20 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  nal-mode..*/.int
30d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
30d40 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a  rnalMode(Pager *
30d50 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
30d60 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
30d70 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
30d80 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  ALMODE_QUERY.   
30d90 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
30da0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
30db0 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
30dc0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
30dd0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
30de0 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20  ODE_TRUNCATE.   
30df0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
30e00 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
30e10 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
30e20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
30e30 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
30e40 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
30e50 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
30e60 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30e70 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73  E_MEMORY );.  as
30e80 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
30e90 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
30ea0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
30eb0 30 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20  0 && (!MEMDB || 
30ec0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
30ed0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
30ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30ef0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
30f00 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
30f10 41 4c 4d 4f 44 45 5f 4f 46 46 29 20 29 7b 0a 20  ALMODE_OFF) ){. 
30f20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
30f30 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  alMode = (u8)eMo
30f40 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
30f50 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
30f60 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urnalMode;.}../*
30f70 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
30f80 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20  size-limit used 
30f90 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
30fa0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
30fb0 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20  .** Setting the 
30fc0 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31  size limit to -1
30fd0 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20   means no limit 
30fe0 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20  is enforced..** 
30ff0 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65  An attempt to se
31000 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65  t a limit smalle
31010 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e  r than -1 is a n
31020 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  o-op..*/.i64 sql
31030 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
31040 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20  SizeLimit(Pager 
31050 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69  *pPager, i64 iLi
31060 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d  mit){.  if( iLim
31070 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50  it>=-1 ){.    pP
31080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
31090 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b  eLimit = iLimit;
310a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
310b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
310c0 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLimit;.}../*.**
310d0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
310e0 72 20 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d  r to the pPager-
310f0 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c  >pBackup variabl
31100 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f  e. The backup mo
31110 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75  dule.** in backu
31120 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68  p.c maintains th
31130 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
31140 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73  s variable. This
31150 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20   module.** uses 
31160 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61  it opaquely as a
31170 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  n argument to sq
31180 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
31190 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69  rt() and.** sqli
311a0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
311b0 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74  ) only..*/.sqlit
311c0 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69  e3_backup **sqli
311d0 74 65 33 50 61 67 65 72 42 61 63 6b 75 70 50 74  te3PagerBackupPt
311e0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
311f0 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61 67  {.  return &pPag
31200 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a  er->pBackup;.}..
31210 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31220 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.